home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 23 / CU Amiga - Super CD-ROM 23 (June 1998).iso / CreatingGames / GameCreators / TADS / manuals / TEX / TADS22.SAM (.txt) < prev    next >
Encoding:
Ami Pro/Word Pro document  |  1994-10-23  |  604.3 KB  |  4,022 lines

  1. [ver]
  2. [sty]
  3.     TADS22.STY
  4. [files]
  5. [charset]
  6.     ANSI (Windows, IBM CP 1252)
  7. [revisions]
  8. [master]
  9.     C:\TADS\DOC\t22cont.SAM
  10. [prn]
  11.     HP LaserJet Series II
  12. [port]
  13.     LPT1:
  14. [lang]
  15. [desc]
  16.     782901419
  17.     777409063
  18.     2954
  19. [fopts]
  20. [lnopts]
  21.     Body Text
  22. [docopts]
  23. [GramStyle]
  24.     Technical Writing
  25. [ParaNum]
  26. [tag]
  27.     Body Text
  28.     [fnt]
  29.         MinioMM_345 wt 585 wd 12 op
  30.         200
  31.         49152
  32.     [algn]
  33.         720
  34.     [spc]
  35.         273
  36.         100
  37.     [brk]
  38.     [line]
  39.     [spec]
  40.     [nfmt]
  41.         280
  42.     Body Text
  43. [tag]
  44.     Body Single
  45.     [fnt]
  46.         Times New Roman
  47.         160
  48.         49152
  49.     [algn]
  50.     [spc]
  51.         100
  52.     [brk]
  53.     [line]
  54.     [spec]
  55.     [nfmt]
  56.         280
  57.     Body Single
  58. [tag]
  59.     Subhead
  60.     [fnt]
  61.         MezzMM_585 BD
  62.         480
  63.         16387
  64.     [algn]
  65.     [spc]
  66.         561
  67.         100
  68.     [brk]
  69.     [line]
  70.     [spec]
  71.     [nfmt]
  72.         272
  73.     Subhead
  74. [tag]
  75.     Title
  76.     [fnt]
  77.         GillSans
  78.         480
  79.         16384
  80.     [algn]
  81.     [spc]
  82.         561
  83.         144
  84.         100
  85.     [brk]
  86.     [line]
  87.     [spec]
  88.     [nfmt]
  89.         272
  90.     Title
  91. [tag]
  92.     Header
  93.     [fnt]
  94.         GillSans
  95.         280
  96.         16384
  97.     [algn]
  98.     [spc]
  99.         360
  100.         100
  101.     [brk]
  102.     [line]
  103.     [spec]
  104.     [nfmt]
  105.         280
  106.     Header
  107. [tag]
  108.     example
  109.     [fnt]
  110.         Courier New
  111.         240
  112.         32768
  113.     [algn]
  114.         720
  115.     [spc]
  116.         273
  117.         100
  118.     [brk]
  119.     [line]
  120.     [spec]
  121.     [nfmt]
  122.         280
  123.     example
  124. [tag]
  125.     TOC1
  126.     [fnt]
  127.         GillSans
  128.         280
  129.         16384
  130.     [algn]
  131.         360
  132.     [spc]
  133.         273
  134.         100
  135.     [brk]
  136.     [line]
  137.     [spec]
  138.     [nfmt]
  139.         280
  140.     TOC1
  141. [tag]
  142.     TOCPG1
  143.     [fnt]
  144.         GillSans
  145.         280
  146.         16384
  147.     [algn]
  148.     [spc]
  149.         273
  150.         100
  151.     [brk]
  152.     [line]
  153.     [spec]
  154.     [nfmt]
  155.         280
  156.     TOCPG1
  157. [tag]
  158.     TOC2
  159.     [fnt]
  160.         MinioMM_345 wt 585 wd 12 op
  161.         200
  162.         49152
  163.     [algn]
  164.         360
  165.         720
  166.     [spc]
  167.         273
  168.         100
  169.     [brk]
  170.     [line]
  171.     [spec]
  172.     [nfmt]
  173.         280
  174.     TOC2
  175. [tag]
  176.     TOCPG2
  177.     [fnt]
  178.         MinioMM_345 wt 585 wd 12 op
  179.         200
  180.         49152
  181.     [algn]
  182.     [spc]
  183.         273
  184.         100
  185.     [brk]
  186.     [line]
  187.     [spec]
  188.     [nfmt]
  189.         280
  190.     TOCPG2
  191. [tag]
  192.     TOC3
  193.     [fnt]
  194.         MinioMM_345 wt 585 wd 12 op
  195.         200
  196.         49152
  197.     [algn]
  198.         720
  199.         1080
  200.     [spc]
  201.         273
  202.         100
  203.     [brk]
  204.     [line]
  205.     [spec]
  206.     [nfmt]
  207.         280
  208.     TOC3
  209. [tag]
  210.     TOCPG3
  211.     [fnt]
  212.         MinioMM_345 wt 585 wd 12 op
  213.         200
  214.         49152
  215.     [algn]
  216.     [spc]
  217.         273
  218.         100
  219.     [brk]
  220.     [line]
  221.     [spec]
  222.     [nfmt]
  223.         280
  224.     TOCPG3
  225. [tag]
  226.     TOC4
  227.     [fnt]
  228.         MinioMM_345 wt 585 wd 12 op
  229.         200
  230.         49152
  231.     [algn]
  232.         1080
  233.         1440
  234.     [spc]
  235.         273
  236.         100
  237.     [brk]
  238.     [line]
  239.     [spec]
  240.     [nfmt]
  241.         280
  242.     TOC4
  243. [tag]
  244.     TOCPG4
  245.     [fnt]
  246.         MinioMM_345 wt 585 wd 12 op
  247.         200
  248.         49152
  249.     [algn]
  250.     [spc]
  251.         273
  252.         100
  253.     [brk]
  254.     [line]
  255.     [spec]
  256.     [nfmt]
  257.         280
  258.     TOCPG4
  259. [tag]
  260.     TOC5
  261.     [fnt]
  262.         MinioMM_345 wt 585 wd 12 op
  263.         200
  264.         49152
  265.     [algn]
  266.         1440
  267.         1800
  268.     [spc]
  269.         273
  270.         100
  271.     [brk]
  272.     [line]
  273.     [spec]
  274.     [nfmt]
  275.         280
  276.     TOC5
  277. [tag]
  278.     TOCPG5
  279.     [fnt]
  280.         MinioMM_345 wt 585 wd 12 op
  281.         200
  282.         49152
  283.     [algn]
  284.     [spc]
  285.         273
  286.         100
  287.     [brk]
  288.     [line]
  289.     [spec]
  290.     [nfmt]
  291.         280
  292.     TOCPG5
  293. [tag]
  294.     TOC6
  295.     [fnt]
  296.         MinioMM_345 wt 585 wd 12 op
  297.         200
  298.         49152
  299.     [algn]
  300.         1800
  301.         2160
  302.     [spc]
  303.         273
  304.         100
  305.     [brk]
  306.     [line]
  307.     [spec]
  308.     [nfmt]
  309.         280
  310.     TOC6
  311. [tag]
  312.     TOCPG6
  313.     [fnt]
  314.         MinioMM_345 wt 585 wd 12 op
  315.         200
  316.         49152
  317.     [algn]
  318.     [spc]
  319.         273
  320.         100
  321.     [brk]
  322.     [line]
  323.     [spec]
  324.     [nfmt]
  325.         280
  326.     TOCPG6
  327. [tag]
  328.     TOC7
  329.     [fnt]
  330.         MinioMM_345 wt 585 wd 12 op
  331.         200
  332.         49152
  333.     [algn]
  334.         2160
  335.         2520
  336.     [spc]
  337.         273
  338.         100
  339.     [brk]
  340.     [line]
  341.     [spec]
  342.     [nfmt]
  343.         280
  344.     TOC7
  345. [tag]
  346.     TOCPG7
  347.     [fnt]
  348.         MinioMM_345 wt 585 wd 12 op
  349.         200
  350.         49152
  351.     [algn]
  352.     [spc]
  353.         273
  354.         100
  355.     [brk]
  356.     [line]
  357.     [spec]
  358.     [nfmt]
  359.         280
  360.     TOCPG7
  361. [tag]
  362.     TOC8
  363.     [fnt]
  364.         MinioMM_345 wt 585 wd 12 op
  365.         200
  366.         49152
  367.     [algn]
  368.         2520
  369.         2880
  370.     [spc]
  371.         273
  372.         100
  373.     [brk]
  374.     [line]
  375.     [spec]
  376.     [nfmt]
  377.         280
  378.     TOC8
  379. [tag]
  380.     TOCPG8
  381.     [fnt]
  382.         MinioMM_345 wt 585 wd 12 op
  383.         200
  384.         49152
  385.     [algn]
  386.     [spc]
  387.         273
  388.         100
  389.     [brk]
  390.     [line]
  391.     [spec]
  392.     [nfmt]
  393.         280
  394.     TOCPG8
  395. [tag]
  396.     TOC9
  397.     [fnt]
  398.         MinioMM_345 wt 585 wd 12 op
  399.         200
  400.         49152
  401.     [algn]
  402.         2880
  403.         3240
  404.     [spc]
  405.         273
  406.         100
  407.     [brk]
  408.     [line]
  409.     [spec]
  410.     [nfmt]
  411.         280
  412.     TOC9
  413. [tag]
  414.     TOCPG9
  415.     [fnt]
  416.         MinioMM_345 wt 585 wd 12 op
  417.         200
  418.         49152
  419.     [algn]
  420.     [spc]
  421.         273
  422.         100
  423.     [brk]
  424.     [line]
  425.     [spec]
  426.     [nfmt]
  427.         280
  428.     TOCPG9
  429. [tag]
  430.     Table Text
  431.     [fnt]
  432.         MinioMM_345 wt 585 wd 12 op
  433.         200
  434.         49152
  435.     [algn]
  436.     [spc]
  437.         273
  438.         100
  439.     [brk]
  440.     [line]
  441.     [spec]
  442.     [nfmt]
  443.         280
  444.     Table Text
  445. [tag]
  446.     PartNumber
  447.     [fnt]
  448.         GillSans
  449.         480
  450.         16384
  451.     [algn]
  452.     [spc]
  453.         446
  454.         144
  455.         100
  456.     [brk]
  457.     [line]
  458.     [spec]
  459.     [nfmt]
  460.         272
  461.     PartNumber
  462. [lay]
  463.     Standard
  464.     1287
  465.     [rght]
  466.         12240
  467.         15840
  468.         8553
  469.         1368
  470.         316
  471.         662
  472.         8553
  473.         15177
  474.         720
  475.         1440
  476.         2160
  477.         2880
  478.         3600
  479.         4320
  480.         5040
  481.         5760
  482.         6480
  483.         7200
  484.         7920
  485.         8640
  486.     [lft]
  487.         12240
  488.         15840
  489.         662
  490.         1368
  491.         316
  492.         8553
  493.         662
  494.         7286
  495.         720
  496.         1440
  497.         2160
  498.         2880
  499.         3600
  500.         4320
  501.         5040
  502.         5760
  503.         6480
  504.         7200
  505.         7920
  506.         8640
  507.     [hlft]
  508.     [lyfrm]
  509.         3008
  510.         15840
  511.         316
  512.         1 0 0 0 0 0 0
  513.     [frmlay]
  514.         316
  515.         15840
  516.         1440
  517.         316
  518.         1440
  519.         1440
  520.         14400
  521.         4680
  522.         9360
  523.     [txt]
  524.     [hrght]
  525.     [lyfrm]
  526.         11200
  527.         15840
  528.         316
  529.         1 0 0 0 0 0 0
  530.     [frmlay]
  531.         316
  532.         15840
  533.         1440
  534.         316
  535.         1440
  536.         1440
  537.         14400
  538.         4680
  539.         9360
  540.     [txt]
  541.     [flft]
  542.     [lyfrm]
  543.         5056
  544.         10872
  545.         15840
  546.         12240
  547.         1 0 0 0 0 0 0
  548.     [frmlay]
  549.         12240
  550.         15840
  551.         648
  552.         576
  553.         10944
  554.         8568
  555.         648
  556.         7272
  557.         4680
  558.         9360
  559.     [txt]
  560. <:I0,0,0,0>
  561. <+A><:I0,0,0,0><+">The TADS 2.2 Upgrade Manual<-">
  562.     [frght]
  563.     [lyfrm]
  564.         13248
  565.         10872
  566.         15840
  567.         12240
  568.         1 0 0 0 0 0 0
  569.     [frmlay]
  570.         12240
  571.         15840
  572.         8568
  573.         576
  574.         10944
  575.         648
  576.         8568
  577.         15192
  578.         4680
  579.         9360
  580.     [txt]
  581. <:I0,0,0,0><:f,,>
  582. <:I0,0,0,0><:f,,>
  583.     [repfrm]
  584.     [lyfrm]
  585.         74688
  586.         8481
  587.         11102
  588.         15162
  589.         11663
  590.         1 0 0 100 100 18 0
  591.         16777215
  592.     [frmlay]
  593.         11663
  594.         6681
  595.         144
  596.         11102
  597.         144
  598.         8639
  599.         15004
  600.     [txt]
  601. <:I0,136,0,0><:X4,1;Seq MySeq %N2><:X~4;I>
  602. [elay]
  603. [lay]
  604.     1287
  605.     [rght]
  606.         12240
  607.         15840
  608.         8568
  609.         1152
  610.         489
  611.         648
  612.         8568
  613.         15192
  614.         720
  615.         1440
  616.         2160
  617.         2880
  618.         3600
  619.         4320
  620.         5040
  621.         5760
  622.         6480
  623.         7200
  624.         7920
  625.         8640
  626.     [lft]
  627.         12240
  628.         15840
  629.         648
  630.         1152
  631.         489
  632.         8568
  633.         648
  634.         7272
  635.         720
  636.         1440
  637.         2160
  638.         2880
  639.         3600
  640.         4320
  641.         5040
  642.         5760
  643.         6480
  644.         7200
  645.         7920
  646.         8640
  647.     [hlft]
  648.     [lyfrm]
  649.         3008
  650.         15840
  651.         489
  652.         1 0 0 0 0 0 0
  653.     [frmlay]
  654.         489
  655.         15840
  656.         1440
  657.         244
  658.         1440
  659.         1440
  660.         14400
  661.         4680
  662.         9360
  663.     [txt]
  664.     [hrght]
  665.     [lyfrm]
  666.         11200
  667.         15840
  668.         489
  669.         1 0 0 0 0 0 0
  670.     [frmlay]
  671.         489
  672.         15840
  673.         1440
  674.         244
  675.         1440
  676.         1440
  677.         14400
  678.         4680
  679.         9360
  680.     [txt]
  681.     [flft]
  682.     [lyfrm]
  683.         5056
  684.         11088
  685.         15840
  686.         12240
  687.         1 0 0 0 0 0 0
  688.     [frmlay]
  689.         12240
  690.         15840
  691.         648
  692.         345
  693.         11174
  694.         8568
  695.         648
  696.         7272
  697.         4680
  698.         9360
  699.     [txt]
  700.     [frght]
  701.     [lyfrm]
  702.         13248
  703.         11088
  704.         15840
  705.         12240
  706.         1 0 0 0 0 0 0
  707.     [frmlay]
  708.         12240
  709.         15840
  710.         8568
  711.         345
  712.         11174
  713.         648
  714.         8568
  715.         15192
  716.         4680
  717.         9360
  718.     [txt]
  719. [elay]
  720.     16 195 80 4096 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  721.     40 244 27 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  722.     64 0 28 0 0 1 0 273 2 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  723.     93 195 24 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  724.     109 529 48 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  725.     125 0 0 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  726.     149 280 10 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  727.     180 0 0 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  728.     195 183 42 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  729.     207 334 87 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  730.     221 75 83 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  731.     232 486 92 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  732.     245 168 86 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  733.     265 267 76 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  734.     282 160 78 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  735.     295 74 85 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  736.     308 353 86 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  737.     327 0 0 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  738.     354 305 99 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  739.     361 0 0 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  740.     378 100 88 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  741.     395 279 76 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  742.     418 295 80 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  743.     432 402 77 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  744.     450 175 87 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  745.     463 0 0 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  746.     482 273 131 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  747.     503 0 0 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  748.     519 0 0 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  749.     539 78 139 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  750.     562 0 0 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  751.     585 188 106 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  752.     601 182 64 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  753.     615 0 2 0 1 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  754.     634 0 0 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  755.     661 74 97 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  756.     669 79 97 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  757.     684 69 87 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  758.     703 400 27 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  759.     720 0 0 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  760.     735 145 49 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  761.     751 266 105 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  762.     764 0 0 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  763.     786 0 2 0 1 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  764.     800 0 25 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  765.     830 88 126 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  766.     847 492 11 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  767.     862 157 61 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  768.     880 0 0 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  769.     895 474 10 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  770.     916 0 0 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  771.     927 0 5 512 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  772.     938 885 78 4128 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  773.     959 0 26 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  774.     974 154 79 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  775.     991 591 105 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  776.     1012 203 73 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  777.     1021 199 64 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  778.     1049 0 0 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  779.     1056 156 92 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  780.     1071 381 96 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  781.     1083 653 80 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  782.     1094 590 25 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  783.     1107 184 103 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  784.     1128 79 86 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  785.     1145 233 81 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  786.     1154 79 83 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  787.     1162 563 121 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  788.     1180 236 21 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  789.     1189 665 84 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  790.     1218 0 20 32 0 0 0 273 2 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  791.     1247 0 0 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  792.     1265 0 0 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  793.     1275 77 125 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  794.     1281 77 46 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  795.     1289 232 55 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  796.     1304 0 14 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  797.     1316 73 101 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  798.     1343 0 66 0 0 1 0 65535 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  799.     1357 0 38 0 0 1 0 273 2 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  800.     1393 92 104 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  801.     1404 76 103 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  802.     1427 181 29 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  803.     1435 951 110 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  804.     1451 0 73 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  805.     1462 719 11 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  806.     1480 0 0 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  807.     1491 79 80 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  808.     1498 376 8 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  809.     1505 632 16 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  810.     1526 93 79 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  811.     1541 116 100 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  812.     1546 690 79 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  813.     1550 162 80 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  814.     1561 76 80 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  815.     1578 177 76 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  816.     1589 83 79 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  817.     1596 463 69 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  818.     1606 949 31 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  819.     1622 178 37 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  820.     1646 249 100 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  821.     1658 222 81 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  822.     1677 0 0 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  823.     1690 74 84 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  824.     1704 234 12 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  825.     1713 757 86 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  826.     1729 363 8 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  827.     1754 96 79 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  828.     1764 334 84 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  829.     1780 245 71 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  830.     1795 0 26 0 0 1 0 273 2 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  831.     1815 0 0 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  832.     1824 393 83 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  833.     1838 0 44 0 0 1 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  834.     1872 0 23 0 0 1 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  835.     1892 742 6 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  836.     1919 0 20 0 0 0 0 273 2 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  837.     1942 265 46 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  838.     1956 252 16 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  839.     1973 126 73 32 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  840.     1988 170 77 0 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  841.     1996 0 0 1025 0 0 0 273 65535 1    65535 0 0    0 0 0 0 0 0 0 65535 0 0 65535 1 0 0 0 0
  842. [edoc]
  843. @PartNumber@<:S+-1><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:f200,2MinioMM_345 wt 585 wd 12 op,0,0,0><:h<*&>
  844. <:I0,0,0,0><:R1,2,2,3312,3,9360,><+">
  845. <:I0,0,0,0><:S+273><:R1,1,2,3312,><+"><-"><:P10,0,>    <+">TADS 2.2 Upgrade Manual<-">
  846. <:h<**>
  847. <:R1,3,2,3402,3,6517,3,9360,>    <+">Verion 2.2 Release Notes    <-"><:P10,0,>
  848. <:h<*&>
  849. <:I0,0,0,0><:R1,2,2,3312,3,9360,><+">
  850. <:I0,0,0,0><:S+273><:R1,1,2,3312,><+"><-"><:P10,0,>    <+">The TADS 2.2 Upgrade Manual<-">
  851. <:h<**>
  852. <:R1,3,2,3402,3,6517,3,9360,>    <+">Version 2.2 Release Notes    <-"><:P10,0,>
  853. @PartNumber@<:S+-1><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#240,6624><:f><:f200,2MinioMM_345 wt 585 wd 12 op,0,0,0>
  854. @PartNumber@<:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#562,6624><:f480,BMezzMM_725 BL,>Part I<:f>
  855. @Title@<:s><:S+417><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#417,6624><:f720,BMezzMM_585 BD,>Version 2.2 Release Notes<:f>
  856. <:s><:S+273><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,BMezzMM_585 BD,>
  857. <:I0,432,0,0><:S+273><:R1,15,1,432,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  858. <:I0,414,0,0><:S+273><:R1,15,1,0,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>Welcome to TADS 2.2!
  859. <:I0,414,0,0><:S+273><:R1,15,1,0,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>This booklet is a supplement to the <+">TADS Author's Manual<-">, version 2.0, that describes all of the new features that have been added since version 2.0.
  860. <:I0,414,0,0><:S+273><:R1,15,1,0,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>This booklet has two parts.  Part I describes the additions and changes to TADS since version 2.0.  If you're already familiar with version 2.1, you've already seen some of this material before; we've marked the sections that were also described in the vers
  861. ion 2.1 release notes to make it easy to see at a glance what's new.
  862. <:I0,414,0,0><:S+273><:R1,15,1,0,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>Part II of this booklet is a full new chapter describing the TADS player command parser.  Because so many of the new features since version 2.0 affect the parser, it would have been difficult to assemble a clear picture of how the parser works by reading un
  863. connected descriptions of the numerous new features.  Part II therefore is a complete description of the entire TADS parser, including all of the modern features, along with everything that was present in version 2.0.
  864. <:I0,414,0,0><:S+273><:R1,15,1,0,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  865. <:s><:I0,432,0,0><:S+273><:R1,15,1,432,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  866. @Header@<:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#283,6624>"Replace" and "Modify" (2.1)
  867. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  868. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>Most game authors find that, when writing a substantial game, they can't avoid modifying objects in adv.t.  While there's nothing intrinsically wrong with this, it creates a problem when a new version of TADS is released:  you must either continue to use yo
  869. ur old version of adv.t, or take the time to reconcile your changes with any changes we made in the new version.  If you continue to use the old version, you won't be able to take advantage of any improvements or corrections we've made to adv.t.
  870. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2184,6624>In version 2.1, we added a mechanism that lets you avoid this problem:  the 
  871. <:f200,QCourier New,>replace<:f> and <:f200,QCourier New,>modify<:f> keywords.  These new keywords let you make changes to objects that have been previously defined in the game program.  In other words, you can 
  872. <:f200,QCourier New,>#include<:f> the standard definitions in adv.t, and then make changes to objects that the compiler has already finished compiling.  Using these new keywords, you can make three types of changes to previously-defined objects:  you can re
  873. place a function entirely, you can replace an object entirely, or you can add to or change methods already defined in an object.
  874. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>To replace a function that's already been defined, you simply use the keyword 
  875. <:f200,QCourier New,>replace<:f> before the new function definition.  Following the keyword 
  876. <:f200,QCourier New,>replace<:f> is an otherwise normal function definition.
  877. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  878. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>#include <<adv.t<;><:f>
  879. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>
  880. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>replace scoreStatus: function(points, turns)
  881. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>{
  882. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    setscore(cvtstr(points) + ' points/' +
  883. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        cvtstr(turns) + ' moves');
  884. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>}<:f>
  885. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  886. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>You can do exactly the same thing with objects.  For example, you can entirely replace the 
  887. <:f200,QCourier New,>fastenVerb<:f> defined in adv.t:
  888. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  889. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>#include <<adv.t<;><:f>
  890. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>
  891. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>/* we don't want 'buckle' -<:f><:f200,QCourier New,> replace the verb */
  892. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>replace fastenVerb: deepverb
  893. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    verb = 'fasten'
  894. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    sdesc = "fasten"
  895. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    prepDefault = toPrep
  896. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    ioAction(toPrep) = 'FastenTo'
  897. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>;<:f>
  898. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  899. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>Replacing an object entirely deletes the previous definition, including all inheritance information and vocabulary.  The only properties of a replaced object are those defined in the replacement; the original definition is entirely discarded.
  900. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>You can also <+">modify<-"> an object, retaining its original definition, including inheritance information, vocabulary, and properties.  This allows you to add new properties and vocabulary.  You can also override properties, simply by redefining them in t
  901. he new definition.
  902. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>The most common addition to an object from adv.t will probably be new verb associations and added vocabulary:
  903. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  904. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>modify pushVerb
  905. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    verb = 'nudge'
  906. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    ioAction(withPrep) = 'PushWith'
  907. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>;<:f>
  908. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  909. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2184,6624>Note several things about this example.  First, no superclass information can be specified in a 
  910. <:f200,QCourier New,>modify<:f> statement; this is because the superclass list for the modified object is the same as for the original object.  Second, note that vocabulary has been added.  The new vocabulary doesn't replace the original vocabulary, but sim
  911. ply adds to the original vocabulary.  Further note that the verb association pseudo-properties, 
  912. <:f200,QCourier New,>doAction<:f> and <:f200,QCourier New,>ioAction<:f>, are legal in a 
  913. <:f200,QCourier New,>modify<:f> statement.  Any new <:f200,QCourier New,>doAction<:f> or 
  914. <:f200,QCourier New,>ioAction<:f> definitions are added to the original set of definitions.
  915. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>In a method that you redefine with <:f200,QCourier New,>modify<:f>, you can use 
  916. <:f200,QCourier New,>pass<:f> and <:f200,QCourier New,>inherited<:f> to refer to the 
  917. <+">replaced<-"> method in the original definition of the object.  In essence, using 
  918. <:f200,QCourier New,>modify<:f> renames the original object, and then creates a new object under the original name; the new object is created as a subclass of the original (now unnamed) object.  (There is no way to refer to the original, unmodified object d
  919. irectly; you can only refer to it indirectly through the modified object.)  Here's an example of using 
  920. <:f200,QCourier New,>pass<:f> with <:f200,QCourier New,>modify<:f>:
  921. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  922. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>class testClass: object
  923. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    sdesc = "testClass"
  924. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>;
  925. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    
  926. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>testObj: testClass
  927. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    sdesc =
  928. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    {
  929. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        "testObj...";
  930. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        pass sdesc;
  931. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    }
  932. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>;
  933. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>
  934. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>modify testObj
  935. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    sdesc =
  936. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    {
  937. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        "modified testObj...";
  938. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        pass sdesc;
  939. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    }
  940. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>;<:f>
  941. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  942. <:I0,0,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>Evaluating <:f200,QCourier New,>testObj.sdesc<:f> will display this:
  943. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  944. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>modified testObj...testObj...testClass<:f>
  945. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  946. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>You can also replace a property entirely, erasing all traces of the original definition of the property.  The original definition is entirely forgotten--using 
  947. <:f200,QCourier New,>pass<:f> or <:f200,QCourier New,>inherited<:f> will refer to the method inherited by the original object.  To do this, use the 
  948. <:f200,QCourier New,>replace<:f> keyword with the property itself:
  949. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  950. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>modify testObj
  951. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    replace sdesc =
  952. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    {
  953. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        "modified testObj...";
  954. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        pass sdesc;
  955. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    }
  956. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>;<:f>
  957. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  958. <:I0,0,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>This would result in a different display for <:f200,QCourier New,>testObj.sdesc<:f>:
  959. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  960. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>modified testObj...testClass<:f>
  961. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  962. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>The <:f200,QCourier New,>replace<:f> keyword before the property definition tells the compiler to completely delete the previous definitions of the property.  This allows you to completely replace the property, and not merely override it, meaning that 
  963. <:f200,QCourier New,>pass<:f> and <:f200,QCourier New,>inherited<:f> will refer to the property actually inherited from the superclass, and not the original definition of the property.
  964. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  965. @Header@<:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#283,6624>Dynamic Object Creation
  966. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  967. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>TADS now allows you to create and delete objects dynamically at run-time.  This is done through two new operators:  
  968. <:f200,QCourier New,>new<:f> and <:f200,QCourier New,>delete<:f>.  To create a new object, use this syntax:
  969. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  970. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>x := new bookItem;<:f>
  971. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  972. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>This dynamically creates a new object whose superclass is <:f200,QCourier New,>bookItem<:f>.  When this statement is executed, the runtime creates a new object, assigns its superclass to be 
  973. <:f200,QCourier New,>bookItem<:f>, and executes the <:f200,QCourier New,>construct<:f> method in the new object; this method can perform any creation-time setup that you wish to do.  The default 
  974. <:f200,QCourier New,>construct<:f> method in the class <:f200,QCourier New,>thing<:f> in adv.t simply moves the new object into its location--this is necessary so that the 
  975. <:f200,QCourier New,>contents<:f> list of the location is updated to include the new object.
  976. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>An expression involving the operator <:f200,QCourier New,>new<:f> applied to a class can be used wherever an object expression can be used.  When the expression is evaluated, a new object of the given class is created.
  977. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Note that you can create a new object that has no superclass by using the keyword 
  978. <:f200,QCourier New,>object<:f>:
  979. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  980. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>x := new object;<:f>
  981. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  982. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2457,6624>If you're familiar with C++ constructors, you should note an important difference between the 
  983. <:f200,QCourier New,>construct<:f> method and C++ constructors.  A C++ constructor in a derived class will automatically call the construct in the base class (except for a virtual base class).  The TADS 
  984. <:f200,QCourier New,>construct<:f> method does <+">not<-"></`>automatically call superclass 
  985. <:f200,QCourier New,>construct<:f> methods; instead, <:f200,QCourier New,>construct<:f> works exactly the same as any other TADS method.  You can, of course, call the superclass 
  986. <:f200,QCourier New,>construct<:f> method explicitly using the <:f200,QCourier New,>inherited<:f> mechanism, just as with any other method.  The same is true of the 
  987. <:f200,QCourier New,>destruct<:f> method (described below).
  988. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>A new object inherits all of the vocabulary of its superclass.
  989. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>To destroy an object create with <:f200,QCourier New,>new<:f>, use this syntax:
  990. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  991. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>delete x;<:f>
  992. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  993. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>This first calls the <:f200,QCourier New,>destruct<:f> method of the object to notify it that it is about to be deleted, then destroys the object.  Further references to the object are illegal, since its memory has been released (and thus may be given to an
  994. other object).  The default <:f200,QCourier New,>destruct<:f> method in the class 
  995. <:f200,QCourier New,>thing<:f> in adv.t moves the object into <:f200,QCourier New,>nil<:f>, which removes it from its container's 
  996. <:f200,QCourier New,>contents<:f> list--this is necessary so that the reference to the object in that list is removed.
  997. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Only objects created with <:f200,QCourier New,>new<:f> can be destroyed with 
  998. <:f200,QCourier New,>delete<:f>.  Objects that are defined statically in your game's source file cannot be deleted at run-time.
  999. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>Object creation and deletion works correctly with the UNDO mechanism.  If the player uses UNDO after a move that created an object, the object will be destroyed; likewise, if a player uses UNDO after a turn that deletes an object, the object will be re-crea
  1000. ted with the same property values it had prior to deletion.
  1001. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Similarly, dynamically-created objects are preserved across SAVE and RESTORE operations.
  1002. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2730,6624>Note that TADS does not perform any garbage collection on dynamically-created objects.  The system is not capable of determining whether an object is accessible or not.  Hence, if you lose track of any objects you create with 
  1003. <:f200,QCourier New,>new<:f>, they will remain part of the game forever--they will even be saved along with saved games and restored when the games are restored.  You must be careful to keep track of all objects you create to avoid filling all available mem
  1004. ory (and the swap file) with unreachable objects.  Even though TADS will eventually swap inaccessible objects out of memory, the objects will consume object identifiers, which are a limited resource:  only 65535 objects can be created within a game, includi
  1005. ng both static and dynamically-created objects.
  1006. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1007. @Header@<:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#283,6624><:ZDynamicVocabulary><:Z~DynamicVocabulary>Dynamic Vocabulary
  1008. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1009. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>New built-in functions let you dynamically add to and delete from the vocabulary words of an object.  You can also get the vocabulary words of an object at run-time.
  1010. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>To add to an object's vocabulary, use the new <:f200,QCourier New,>addword()<:f> built-in function.  This function takes three arguments:  an object, a vocabulary property pointer, and a word to add.  For example, to add "red" as an adjective to the object 
  1011. <:f200,QCourier New,>myBook<:f>, you would do this:
  1012. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1013. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>addword(myBook, &adjective, 'red');<:f>
  1014. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1015. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>To delete the same word, you would write a similar call to the new built-in function 
  1016. <:f200,QCourier New,>delword()<:f>:
  1017. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1018. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>delword(myBook, &adjective, 'red');<:f>
  1019. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1020. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>You can add to and delete from the words of any object, including both static objects (explicitly defined in your source code) and dynamically-created objects (created with the operator 
  1021. <:f200,QCourier New,>new<:f>).  
  1022. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Changes made by <:f200,QCourier New,>addword()<:f> and <:f200,QCourier New,>delword()<:f> are tracked correctly by the UNDO mechanism, and are saved and restored along with saved games.
  1023. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>To get the words belonging to an object, use the new <:f200,QCourier New,>getwords()<:f> built-in function.  This function takes two arguments:  an object, and a property pointer; it returns a list of (single-quoted) strings, which are the vocabulary words 
  1024. for the object.  For example, assume we define <:f200,QCourier New,>myBook<:f> as follows:
  1025. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1026. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>myBook:  item
  1027. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    sdesc = "small red book"
  1028. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    adjective = 'small' 'red' 'tiny'
  1029. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    noun = 'book'
  1030. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    location = room2
  1031. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>;<:f>
  1032. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f><:f,QCourier New,>
  1033. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Also assume we haven't made any calls to <:f200,QCourier New,>addword()<:f> or 
  1034. <:f200,QCourier New,>delword()<:f> for <:f200,QCourier New,>myBook<:f>.  In this case,
  1035. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1036. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>getwords(myBook, &adjective)<:f>
  1037. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1038. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>would return this list:
  1039. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1040. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,><[>'small' 'red' 'tiny']<:f>
  1041. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1042. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>Note that the order of the words in the list is not predictable, so you shouldn't expect the words to be in the same order as they were when you defined them in the source file, or in the same order as they were added with 
  1043. <:f200,QCourier New,>addword()<:f>.
  1044. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1045. @Header@<:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#283,6624><:ZGettingVerbInfo><:Z~GettingVerbInfo>Getting Verb Information
  1046. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1047. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>Another new built-in function lets you retrieve information on a verb.  This new function, 
  1048. <:f200,QCourier New,>verbinfo()<:f>, takes as parameters a <:f200,QCourier New,>deepverb<:f> object and an optional preposition object, and returns a list that gives the parser information for this verb.
  1049. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>When you call <:f200,QCourier New,>verbinfo()<:f> with a single argument (a 
  1050. <:f200,QCourier New,>deepverb<:f> object), the return value is a list with two elements, giving information on the 
  1051. <:f200,QCourier New,>doAction<:f> definition for the <:f200,QCourier New,>deepverb<:f> object:
  1052. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1053. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><[>1]    direct object verification property pointer (<:f200,QCourier New,>verDo<+"><:f>Verb<-">)
  1054. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><[>2]    direct object action property pointer (<:f200,QCourier New,>do<+"><:f>Verb<-">)
  1055. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1056. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>When you call <:f200,QCourier New,>verbinfo()<:f> with two arguments (the first is a 
  1057. <:f200,QCourier New,>deepverb<:f> object, and the second is a preposition object), the return value is a list with four elements, giving information on the 
  1058. <:f200,QCourier New,>ioAction<:f> definition for the <:f200,QCourier New,>deepverb<:f> object that matches the given preposition object:
  1059. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1060. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><[>1]    direct object verification property pointer (<:f200,QCourier New,>verDo<+"><:f>Verb<-">)
  1061. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><[>2]    indirect object verification property pointer (<:f200,QCourier New,>verIo<+"><:f>Verb<-">)
  1062. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><[>3]    indirect object action property pointer (<:f200,QCourier New,>io<+"><:f>Verb<-">)
  1063. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><[>4]    <:f200,QCourier New,>true<:f> if this <:f200,QCourier New,>ioAction<:f> has 
  1064. <:f200,QCourier New,><[>disambigDobjFirst]<:f> flag,
  1065. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>    <:f200,QCourier New,>nil<:f> otherwise
  1066. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1067. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>In either case, if the <:f200,QCourier New,>deepverb<:f> doesn't have a corresponding 
  1068. <:f200,QCourier New,>doAction<:f> or <:f200,QCourier New,>ioAction<:f> method, the function returns 
  1069. <:f200,QCourier New,>nil<:f>.
  1070. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>As an example, suppose we define a verb that looks like this:
  1071. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1072. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>pryVerb:  deepverb
  1073. <:I0,432,0,0><:S+273><:R1,15,1,796,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    verb = 'pry'
  1074. <:I0,432,0,0><:S+273><:R1,15,1,796,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    sdesc = "pry"
  1075. <:I0,432,0,0><:S+273><:R1,15,1,796,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    doAction = 'Pry'
  1076. <:I0,432,0,0><:S+273><:R1,15,1,796,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    ioAction(withPrep) = 'PryWith'<:f>
  1077. <:I0,432,0,0><:S+273><:R1,15,1,796,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>;<:f>
  1078. <:I0,432,0,0><:S+273><:R1,15,1,796,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1079. <:I0,432,0,0><:S+273><:R1,15,1,796,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>With this definition, <:f200,QCourier New,>verbinfo(pryVerb)<:f> would return this list, which provides information on the 
  1080. <:f200,QCourier New,>doAction<:f> definintion:
  1081. <:I0,432,0,0><:S+273><:R1,15,1,796,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1082. <:I0,432,0,0><:S+273><:R1,15,1,796,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,><[>&verDoPry, &doPry]<:f>
  1083. <:I0,432,0,0><:S+273><:R1,15,1,796,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1084. <:I0,0,0,0><:S+273><:R1,15,1,796,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>verbinfo(pryVerb, withPrep)<:f> would return this list:
  1085. <:I0,432,0,0><:S+273><:R1,15,1,796,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1086. <:I0,432,0,0><:S+273><:R1,15,1,796,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,><[>&verDoPry, &verIoPry, &ioPry, nil]<:f>
  1087. <:I0,432,0,0><:S+273><:R1,15,1,796,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1088. <:I0,432,0,0><:S+273><:R1,15,1,796,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>If the <:f200,QCourier New,>ioAction<:f> definition had included the 
  1089. <:f200,QCourier New,><[>disambigDobjFirst]<:f> flag, the fourth element of the list would have been 
  1090. <:f200,QCourier New,>true<:f>.
  1091. <:I0,432,0,0><:S+273><:R1,15,1,796,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>Calling <:f200,QCourier New,>verbinfo()<:f> for <:f200,QCourier New,>pryVerb<:f> and any preposition other than 
  1092. <:f200,QCourier New,>withPrep<:f> will return <:f200,QCourier New,>nil<:f>, because the verb doesn't define an 
  1093. <:f200,QCourier New,>ioAction<:f> for any other preposition.  Similarly, if the verb didn't have a 
  1094. <:f200,QCourier New,>doAction<:f> method, <:f200,QCourier New,>verbinfo(pryVerb)<:f> would have returned 
  1095. <:f200,QCourier New,>nil<:f>.
  1096. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1097. @Header@<:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#283,6624><:ZIndistinguishables><:Z~Indistinguishables>Indistinguishable Objects
  1098. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1152,1,1512,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1099. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1152,1,1512,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>The ability to create new objects at run-time leads to some interesting problems involving indistinguishable objects.  Although you could use 
  1100. <:f200,QCourier New,>addword()<:f> to make your newly-created objects distinguishable from one another, this will not always be desirable; for example, if you create new gold pieces that serve as currency, you will probably not want them to be uniquely name
  1101. <:s><:I0,432,0,0><:R1,15,1,792,1,1152,1,1512,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2184,6624>To support indistinguishable objects, especially those created dynamically at run-time, the system now has a property that you can set to indicate to the parser that an object does not need to be distinguished from others of the same class.  The new propert
  1102. y is <:f200,QCourier New,>isEquivalent<:f>.  When <:f200,QCourier New,>isEquivalent<:f> returns 
  1103. <:f200,QCourier New,>true<:f> for an object, all other objects with the same 
  1104. <+">immediate<-"> superclass are considered interchangeable by the parser.  When a player uses one of these objects in a command, the parser will simply pick one arbitrarily and use it, without asking the player which one.
  1105. <:s><:I0,432,0,0><:R1,15,1,792,1,1152,1,1512,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>If a player uses a noun that is ambiguous with multiple equivalent items and one or more other items, the parser will need to disambiguate the objects as usual.  In such cases, the parser's question will list the distinguishable items only once.  For exampl
  1106. e, assume we have five gold coins that are all equivalent (in other words, they all have 
  1107. <:f200,QCourier New,>isEquivalent<:f> set to <:f200,QCourier New,>true<:f>, and they all are immediate subclasses of the same class).  Assume further that a silver coin and a bronze coin are also present in the room.
  1108. <:s><:I0,432,0,0><:R1,15,1,792,1,1152,1,1512,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1109. <:s><:I0,432,0,0><:R1,15,1,792,1,1152,1,1512,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>Treasure Room
  1110. <:s><:I0,432,0,0><:R1,15,1,792,1,1152,1,1512,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>    You see a bronze coin, five gold coins, and a silver coin here.
  1111. <:s><:I0,432,0,0><:R1,15,1,792,1,1152,1,1512,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><;>get coin
  1112. <:s><:I0,432,0,0><:R1,15,1,792,1,1152,1,1512,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>Which coin do you mean, the bronze coin, a gold coin, or the silver coin?
  1113. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1152,1,1512,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1114. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1152,1,1512,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>Note that the objects which appear only once are listed with "the" (using the property 
  1115. <:f200,QCourier New,>thedesc<:f>), while the indistinguishable objects are listed only once, with "a" (using 
  1116. <:f200,QCourier New,>adesc<:f>). 
  1117. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1152,1,1512,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>The functions <:f200,QCourier New,>listcont<:f> and <:f200,QCourier New,>itemcnt<:f> in adv.t have been modified so that they list equivalent objects intelligently; the functions 
  1118. <:f200,QCourier New,>isIndistinguishable<:f> and <:f200,QCourier New,>sayPrefixCount<:f> have been added to adv.t to help with counting and listing indistinguishable objects correctly.  The contents of the Treasure Room are listed in the example above in th
  1119. e new format.  Refer to these functions in adv.t for examples of recognizing objects as equivalent, counting equivalent objects, and treating a set of equivalent objects together as a set.
  1120. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1152,1,1512,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>Note that <:f200,QCourier New,>listcont<:f> uses the new property 
  1121. <:f200,QCourier New,>pluraldesc<:f> to display the name of an object when more than one equivalent object is present.  In the example above, 
  1122. <:f200,QCourier New,>pluraldesc<:f> was used to list the gold coins.  This property has been added to the class 
  1123. <:f200,QCourier New,>thing<:f> in adv.t, but you may need to override it for some objects--the default implementation simply displays the 
  1124. <:f200,QCourier New,>sdesc<:f> plus the letter "s."
  1125. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1152,1,1512,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1126. @Header@<:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#283,6624>Capturing Displayed Text
  1127. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>
  1128. <:I0,432,0,0><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>TADS now has a feature that lets you capture the text displays that are generated by double-quoted strings and by the 
  1129. <:f200,QCourier New,>say()<:f> built-in function.  This feature allows you to examine the values of methods such as 
  1130. <:f200,QCourier New,>ldesc<:f> and <:f200,QCourier New,>sdesc<:f>; since these methods display text, there is no direct way of manipulating their text as strings.  The new output capture feature makes it possible for you to examine and manipulate any text t
  1131. hat ordinarily would simply be displayed.
  1132. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>To use this new feature, you first tell TADS that you wish to begin capturing output by calling a new built-in function:
  1133. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1134. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>stat := outcapture(true);<:f>
  1135. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1136. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>This begins capturing output.  The return value is a status code that you use in a subsequent call to turn off output capturing; this status code allows output capturing calls to be "nested," since the status code allows the capturing status that was in eff
  1137. ect on a call to begin capturing to be restored on the subsequent call to end capturing.  This status code is for use by TADS only--the only thing you do with it is use it in the subsequent call to end capturing.
  1138. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>While output is being captured, any text that would normally be displayed is instead saved by the system.  The user does not see any text displayed while capturing is in effect.  After you begin capturing, simply call any methods whose displays you want to 
  1139. examine; for example, you could call <:f200,QCourier New,>redbook.sdesc<:f> if you want to examine the short description of the object 
  1140. <:f200,QCourier New,>redbook<:f>.
  1141. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>After you've finished calling the methods whose displays you want to examine, end capturing by calling 
  1142. <:f200,QCourier New,>outcapture()<:f> again, passing as the argument the status code returned by the first call:
  1143. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1144. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>str := outcapture(stat);<:f>
  1145. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1146. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>This second call tells TADS to stop capturing output.  The return value of this function is a (single-quoted) string containing all of the text that was displayed since the corresponding call to 
  1147. <:f200,QCourier New,>outcapture(true)<:f>.
  1148. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>When text is being captured, TADS expands all format strings (strings such as "%you%"), and processes "\^" and "\v" sequences (which convert the next character to upper- and lower-case, respectively).  However, all other escape sequences (such as "\n" and "
  1149. \t") are left in the string intact.
  1150. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>You can display the string returned from the call to <:f200,QCourier New,>outcapture(stat)<:f> using the 
  1151. <:f200,QCourier New,>say()<:f> built-in function.  This should result in the same text display that would have occurred if you hadn't turned on capturing.
  1152. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>You can nest calls to <:f200,QCourier New,>outcapture()<:f>; as explained above, the status code returned from the first call is used to restore the capturing status of the previous call.  The string returned by a call to turn off capturing includes only te
  1153. xt that was generated after the corresponding call to turn on capturing.  Because calls to 
  1154. <:f200,QCourier New,>outcapture()<:f> can be nested, you don't have to worry when using text capturing about whether any methods you're calling also use the function.
  1155. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>Note that the system automatically turns off output capturing whenever it prompts the user for a command, for a missing direct or indirect object, or for disambiguation information.  When the system turns off capturing, it clears the captured text, so any s
  1156. ubsequent calls to turn off capturing return empty strings.  You therefore can only capture text within a single command line.
  1157. <:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1158. @Header@<:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#283,6624>Parser Changes
  1159. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>
  1160. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>Many of the changes since version 2.0 have been made to the TADS player command parser.  Since Part II of these release notes provides full documentation of the modern features of the parser, including new features as well as features that were present in v
  1161. ersion 2.0, we won't go into too much detail in this section.  Instead, we'll summarize the changes that have been made, and refer you to the appropriate section in Part II.
  1162. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>If you're not already familiar with the TADS parser, you shouldn't need to read this section at all, because everything described below is documented in Part II.  This section is provided for users of past versions, so that you can see at a glance what's ne
  1163. <:s><:I0,432,0,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>
  1164. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>validD<-!><+!>oList and validI<-!><+!>oList (2.1)<-!>
  1165. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>In version 2.1, we added a new mechanism for determining whether an object is accessible for a command.  The new mechanism supplements the 
  1166. <:f200,QCourier New,>validDo<:f> and <:f200,QCourier New,>validIo<:f> methods, which test a single object to determine if it's accessible for a verb.  The added methods are 
  1167. <:f200,QCourier New,>validDoList<:f> and <:f200,QCourier New,>validIoList<:f>; these methods return a list of valid direct objects and indirect objects (respectively) for a particular command.  As with 
  1168. <:f200,QCourier New,>validDo<:f> and <:f200,QCourier New,>validIo<:f>, these new methods are defined in the 
  1169. <:f200,QCourier New,>deepverb<:f> object for a verb.
  1170. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>The new <:f200,QCourier New,>validDoList<:f> and <:f200,QCourier New,>validIoList<:f> methods are fully described the section on object resolution (page 
  1171. <:X3,-16384;PageRef ObjectResolution>94<:X~3,-16384;PageRef ObjectResolution>).
  1172. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>Note that this new mechanism, if you use it, requires that you use the new 
  1173. <:f200,QCourier New,>floatingItem<:f> class for any object that uses a method for its 
  1174. <:f200,QCourier New,>location<:f> property.  The reason is that objects with non-object 
  1175. <:f200,QCourier New,>location<:f> values are <+">not<-"> part of any 
  1176. <:f200,QCourier New,>contents<:f> list, so they will not be included in any 
  1177. <:f200,QCourier New,>validDoList<:f> or <:f200,QCourier New,>validIoList<:f> return value.  You should make sure that any object in your game that has a method for its 
  1178. <:f200,QCourier New,>location<:f> property includes <:f200,QCourier New,>floatingItem<:f> in its superclass list.
  1179. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1180. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>floatingItem (2.1)<-!>
  1181. <+C><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>The new class <:f200,QCourier New,>f<:f200,QCourier New,>loatingItem<:f> should be used for any object that uses a method for its 
  1182. <:f200,QCourier New,>location<:f> property, because of the new <:f200,QCourier New,>validDoList<:f> and 
  1183. <:f200,QCourier New,>validIoList<:f> validation mechanism, as described above.  If you define an object with a method for its 
  1184. <:f200,QCourier New,>location<:f> property, the object <+">must<-"></`>have 
  1185. <:f200,QCourier New,>floatingItem<:f> among its superclasses in order for it to be accepted as a valid object for the verbs defined in adv.t.
  1186. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1187. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>dobjGen and iobjGen (2.1)<-!>
  1188. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2457,6624>In version 2.1, we enhanced the parsing process so that the TADS parser calls a general-purpose command handler in each object in a command prior to the normal verification and action method calls.  These new general-purpose methods are intended to be "catc
  1189. h-all" handlers that let you treat all verbs, or any set of verbs, alike--since the same methods will be called in the objects regardless of the verb, you can give the same behavior to multiple verbs without having to explicitly code each verb handler indiv
  1190. idually.  These new methods, <:f200,QCourier New,>dobjGen<:f> and 
  1191. <:f200,QCourier New,>iobjGen<:f>, are described fully in part II in the section "General Verb Processing" (page 
  1192. <:X3,-16384;PageRef VerbProcessing>102<:X~3,-16384;PageRef VerbProcessing>).
  1193. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1194. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>Command Prompt Customization (2.1)<-!>
  1195. <:I0,432,0,0><:S+273><:R1,15,1,342,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>Whenever the parser displays a command prompt, it now calls the <:f200,QCourier New,>commandPrompt<:f> function.  This is a function that your game program can define.  See the section on reading a command (page 
  1196. <:X3,-16384;PageRef ReadingACommand>72<:X~3,-16384;PageRef ReadingACommand>) for details.
  1197. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>
  1198. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>New Message Customization Functions<-!><+!> (2.1)<-!>
  1199. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>Several new functions have been added that let you customize messages that the parser generates.  These functions are used to generate complex messages that are normally pieced together from multiple 
  1200. <:f200,QCourier New,>parseError<:f> messages.  Since the parser needs to build these messages from a series of pieces, 
  1201. <:f200,QCourier New,>parseError<:f> lets you change the individual pieces, but not the overall method of construction--for example, it doesn't let you change the order of the phrases generated.  These new functions address this problem.
  1202. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#3003,6624>The new functions are <:f200,QCourier New,>parseError2<:f>, which lets you control the message displayed when an object doesn't understand a verb (because it doesn't define or inherit a verification method for the verb); 
  1203. <:f200,QCourier New,>parseDefault<:f>, which lets you change the message generated when the parser is assuming a default object; 
  1204. <:f200,QCourier New,>parseDisambig<:f>, which lets you control the message asking the player which of several possible objects should be used for a command; and 
  1205. <:f200,QCourier New,>parseAskobj<:f>, which lets you change the message when the parser asks the player to supply a missing direct or indirect object.  Note that 
  1206. <:f200,QCourier New,>parseAskobj<:f> should no longer be used, because the more useful 
  1207. <:f200,QCourier New,>parseAskobjActor<:f> function has been added; games written with 
  1208. <:f200,QCourier New,>parseAskobj<:f> will still work correctly, but new games should use the modern function.  These functions are all described in detail in Part II.
  1209. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1210. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>parseAskobjActor Message Function
  1211. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>We added another new message customization function in version 2.2.  This new function, 
  1212. <:f200,QCourier New,>parseAskobjActor<:f>, is similar to <:f200,QCourier New,>parseAskobj<:f>, but receives the actor as a parameter.  This allows you to generate a better message when the actor isn't 
  1213. <:f200,QCourier New,>Me<:f>.  See the section on verb templates (page 
  1214. <:X3,-16384;PageRef VerbTemplates>85<:X~3,-16384;PageRef VerbTemplates>) for details.
  1215. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1216. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>"Any" and "Either"<-!>
  1217. <:I0,432,0,0><:R><:#1638,6624>The parser now accepts noun phrases that begin with "any" or "either" (or different words that you define with an added slot in the 
  1218. <:f200,QCourier New,>specialWords<:f> statement).  The player can use "any" plus a singular noun phrase, or "any of" plus a plural noun phrase ("either" is equivalent); this instructs the parser to choose one object arbitrarily when the noun phrase refers t
  1219. o more than one object.  See the section on noun phrases (page <:X3,-16384;PageRef NounPhrases>80<:X~3,-16384;PageRef NounPhrases>) for details.
  1220. <:s><:I0,432,0,0><:#273,6624>
  1221. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>Verb Action Redirection<-!>
  1222. <:s><:I0,432,0,0><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>The compiler accepts new syntax that lets you redirect, with a single, concise declaration, the verification and action methods for a particular verb from one object to another object.  For example, if you have a desk that contains a drawer, and you want th
  1223. e verbs "open" and "close" to be directed to the drawer when the player applies them to the desk, the new syntax lets you specify this indirection with these two lines in the definition of the desk object:
  1224. <:s><:I0,432,0,0><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1225. <:I0,432,0,0><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>doOpen -<;> deskDrawer
  1226. <:I0,432,0,0><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>doClose -<;> deskDrawer<:f>
  1227. <:s><:I0,432,0,0><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1228. <:I0,432,0,0><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>This new syntax is described in Part II in the section on verb synonyms and redirection (page 
  1229. <:X3,-16384;PageRef VerbSynonyms>108<:X~3,-16384;PageRef VerbSynonyms>).
  1230. <:s><:I0,432,0,0><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1231. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>multisdesc<-!>
  1232. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>The parser calls a new property, <:f200,QCourier New,>multisdesc<:f>, when listing the current direct object while executing a command with multiple objects.  For example:
  1233. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1234. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><;>put all in box
  1235. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>red ball:  Done.
  1236. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>rubber raft:  The raft is too large.
  1237. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1238. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>The object name listed before the response for each object is now displayed with 
  1239. <:f200,QCourier New,>multisdesc<:f> (in previous versions, the parser used 
  1240. <:f200,QCourier New,>sdesc<:f> for this purpose; for compatibility with existing games, the parser will still call 
  1241. <:f200,QCourier New,>sdesc<:f> for any objects that don't define or inherit 
  1242. <:f200,QCourier New,>multisdesc<:f>).  This is the only place where 
  1243. <:f200,QCourier New,>multisdesc<:f> is used, so if you want to customize this type of display, you can make changes to 
  1244. <:f200,QCourier New,>multisdesc<:f> without any effect on the general 
  1245. <:f200,QCourier New,>sdesc<:f>.
  1246. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1247. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>preparseCmd<-!>
  1248. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>The parser calls a new function, <:f200,QCourier New,>preparseCmd<:f>, before executing each individual command on a command line.  This new command is similar to 
  1249. <:f200,QCourier New,>preparse<:f>, but is more powerful for certain situations, because it is called with a list of words (the result of scanning the command line and breaking it into individual words), and is called with only the words making up a single c
  1250. ommand, rather than the entire command line.  Of course, <:f200,QCourier New,>preparse<:f> still works as before.
  1251. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1252. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>parseError improvements<-!>
  1253. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>Several new <:f200,QCourier New,>parseError<:f> codes have been added, and the default message generation process has been improved for certain cases.  The main changes are to the messages that the parser generates when no 
  1254. <:f200,QCourier New,>parseAskobjActor<:f> or <:f200,QCourier New,>parseAskobj<:f> functions are present.  The full set of 
  1255. <:f200,QCourier New,>parseError<:f> codes is listed on page <:X3,-16384;PageRef parseError>114<:X~3,-16384;PageRef parseError>, and the 
  1256. <:f200,QCourier New,>parseAskobjActor<:f> function, and the new default messages generated when it's not present, are described in the section on verb templates in (page 
  1257. <:X3,-16384;PageRef VerbTemplates>85<:X~3,-16384;PageRef VerbTemplates>).
  1258. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>
  1259. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>Multiple Actors are allowed on a Command Line<-!>
  1260. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>The parser will now allow you to specify the actor to which a command is to be directed for each individual command on a command line.  Previously, the parser only allowed the actor to be specified at the very beginning of the whole line, so any one command
  1261.  line could include commands only to a single actor.  This restriction has been removed; each individual command can specify its own actor.  Any command that doesn't specify an actor is directed to the same actor as the previous command on the same line.  T
  1262. he parser now accepts sentences like this:
  1263. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1264. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><;>go north.  Joe, get the box.  give it to Biff.  Biff, open the box.
  1265. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1266. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>The command "go north" is directed to the player actor (<:f200,QCourier New,>Me<:f>).  "Get the box" and "give it to Biff" are directed to Joe, and "open the box" is directed to Biff.
  1267. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>Note that you can still direct each command to only a single actor.
  1268. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1269. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>More Notifiers, Daemons, and Fuses<-!>
  1270. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>The number of notifiers (set with the <:f200,QCourier New,>notify()<:f> built-in function) that can be simultaneously active has been increased to 200 (the previous limit was 100).  The limit on the number of simultaneously-active fuses has been lifted from
  1271.  50 to 100, and the limit on the number of simultaneously-active daemons has likewise been lifted from 50 to 100.
  1272. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1273. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>More Ambiguous Words<-!>
  1274. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>The number of objects to which a single word can refer has been lifted from 100 to 200.  If you've received an error message such as "The word 'door' refers to too many objects," you've encountered this limit.  As the TADS parser scans a noun phrase, it mus
  1275. t build a list of the objects to which a particular object refers; these lists are limited in size.  For this reason, you should avoid defining a word in your basic classes (such as 
  1276. <:f200,QCourier New,>thing<:f>).  Although this limit has not been removed entirely, we have raised it to make it less likely that you'll encounter it.
  1277. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1278. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>disambigDobjFirst<-!>
  1279. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2184,6624>You can now specify that the processing for an <:f200,QCourier New,>ioAction<:f> definition should resolve (disambiguate) the direct object first.  Normally, TADS will disambiguate the indirect object first, and then resolve the direct objects with a known 
  1280. indirect object.  For some verbs, it's desirable to be able to resolve the direct object first, so that you can decide which indirect object to use based on the known direct object.  The new 
  1281. <:f200,QCourier New,>ioAction<:f> flag, <:f200,QCourier New,>disambigDobjFirst<:f>, allows you to tell TADS to reverse its normal object resolution order.  The section on verb templates (page 
  1282. <:X3,-16384;PageRef VerbTemplates>85<:X~3,-16384;PageRef VerbTemplates>) describes this new flag.
  1283. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1284. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>Actor Disambiguation<-!>
  1285. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2184,6624>Two new methods have been added that give you more control over the process of disambiguating actors:  
  1286. <:f200,QCourier New,>validActor<:f> and <:f200,QCourier New,>preferredActor<:f>.  In previous versions of TADS, the parser disambiguated an actor as though the player were trying to "take" the actor--in other words, the parser used the 
  1287. <:f200,QCourier New,>takeVerb<:f> disambiguation methods to determine if an object was valid as an actor.  TADS now gives you more control over this process by calling these new methods, which are used only for actor disambiguation.  The section on checking
  1288.  for an actor (page <:X3,-16384;PageRef CheckActor>76<:X~3,-16384;PageRef CheckActor>) discusses these new methods.
  1289. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>For compatibility with games written for versions prior to 2.2, if your objects don't define or inherit a 
  1290. <:f200,QCourier New,>validActor<:f> method, the parser will continue to use the old mechanism.
  1291. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1292. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>Improved Plural Handling<-!>
  1293. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>The parser's handling of plurals has been improved.  When you define a word as a plural, and the same word is used by another object as a noun, the parser failed to recognize the object with the noun in past versions.  The parser will now try the plural fir
  1294. st; if no objects are found matching the plural usage, the parser will try the noun usage instead.
  1295. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1296. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>"Of" can be used as a Preposition<-!>
  1297. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>The word "of" can now be used as a preposition, even if it's defined as a special word in the "of" slot.  The parser no longer considers "of" to be a reserved word; the parser only checks for the special meaning in noun phrases (such as "piece of paper") wh
  1298. en the context allows it.  You can now create commands such as "accuse 
  1299. <+">dobj<-"></`>of <+">iobj<-">."
  1300. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1301. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>Adjective-Preposition Overlaps<-!>
  1302. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>When we introduced the new sentence format VERB PREP IOBJ DOBJ (introduced in version 2.1.1) created a problem when the same word was defined as both an adjective and a preposition.  The problem was that the parser always attempted to interpret a phrase suc
  1303. h as "push off button," where "off" is defined as a preposition but also as an adjective for the button, with "off" as a preposition.
  1304. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>The parser has been changed so that the adjective affiliation is stronger.  If an word that can be either a preposition or an adjective is used as part of a noun phrase that refers to at least one object, the parser will interpret the word as an adjective.  
  1305. Only when the word doesn't form a noun phrase with subsequent words will it be interpreted as a preposition.
  1306. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1307. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>rejectMultiDobj<-!>
  1308. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>The parser now lets you prevent the player from using multiple words for a particular command; you can control whether multiple objects are acceptable separately for each verb.  The parser calls the new method 
  1309. <:f200,QCourier New,>rejectMultiDobj<:f> whenever the player uses a list of objects or "all" with a command; if this method returns 
  1310. <:f200,QCourier New,>true<:f>, the parser ignores the command.  The section on multiple objects (page 
  1311. <:X3,-16384;PageRef MultipleObjects>99<:X~3,-16384;PageRef MultipleObjects>) discusses this new method.
  1312. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1313. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>Improved cantReach Handling<-!>
  1314. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>The parser gives you greater control over the error message generated when a set of objects are visible but not accessible for a command.  If you define a 
  1315. <:f200,QCourier New,>cantReach<:f> method in a <:f200,QCourier New,>deepverb<:f> object, the parser will use that method rather than calling the 
  1316. <:f200,QCourier New,>cantReach<:f> method for each inaccessible object.  The section on object resolution (page 
  1317. <:X3,-16384;PageRef ObjectResolution>94<:X~3,-16384;PageRef ObjectResolution>) describes this new method.
  1318. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1319. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>Using the Same Verb for Two Objects<-!>
  1320. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>The parser now generates a warning if you use the same vocabulary word as a 
  1321. <:f200,QCourier New,>verb<:f> property for multiple objects.  The new message is TADS-452, "warning:  same verb defined for two objects."  If you define the same vocabulary word as a verb multiple times, the parser will arbitrarily use one of the 
  1322. <:f200,QCourier New,>deepverb<:f> definitions, and ignore the others; if you weren't aware you were re-using a verb, it could be difficult to track down why your verb handlers were never being called.  The new warning flags this situation for you.
  1323. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1324. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>Multiple Numbers and Strings<-!>
  1325. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>The parser now properly sets the <:f200,QCourier New,>strObj<:f> or 
  1326. <:f200,QCourier New,>numObj<:f> <:f200,QCourier New,>value<:f> property for each individual number of string in a command if more than one appears in a single command.  For example:
  1327. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1328. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><;>type 1, 2, 3 on keypad
  1329. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1330. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>The <:f200,QCourier New,>value<:f> property of the <:f200,QCourier New,>numObj<:f> object will be set to 1 when processing the first number, 2 for the second, and 3 for the third, as you'd expect.  In past versions of TADS, the 
  1331. <:f200,QCourier New,>numObj<:f> and <:f200,QCourier New,>strObj<:f> 
  1332. <:f200,QCourier New,>value<:f> properties were set only for the first number or string in a command.
  1333. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1334. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>"One" and "Ones" are no longer Reserved<-!>
  1335. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>The special words "one" and "ones" (or the words you define in these 
  1336. <:f200,QCourier New,>specialWords<:f> slots) are no longer reserved, so you can use them as ordinary vocabulary words.  The parser now treats the words as having their special meanings only in the contexts where they're needed (in particular, they'll have t
  1337. he special meaning in responses to disambiguation questions, so that the player can respond to a disambiguation question with a phrase such as "the red one").
  1338. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1339. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>"abort"<-!><+!> within a Daemon or Fuse<-!>
  1340. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>You can now use the <:f200,QCourier New,>abort<:f> statement within a daemon or fuse, and it will work as expected, by terminating the current routine and skipping any remaining fuses or daemons on this turn.  In past versions, 
  1341. <:f200,QCourier New,>abort<:f> was not allowed in a fuse or daemon.
  1342. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1343. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>New sentence format:  VERB PREP IOBJ DOB<-!>
  1344. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>The parser now accepts sentences in the format VERB PREP IOBJ DOBJ.  This construction is intended mostly for use in games written in non-English languages that use this sentence format, since it's not a common format for English sentences.  Refer to the se
  1345. ction on verb templates (page <:X3,-16384;PageRef VerbTemplates>85<:X~3,-16384;PageRef VerbTemplates>) for details of how this sentence format is treated.
  1346. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1347. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1348. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1349. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>nilPrep<-!>
  1350. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>In past versions of TADS, when the player entered a sentence in the format VERB IOBJ DOBJ, the parser used "to" as the preposition; there was no way to change this.  You can now specify the preposition to use for sentences in this format by specifying the p
  1351. reposition object as the value of the property <:f200,QCourier New,>nilPrep<:f> in the 
  1352. <:f200,QCourier New,>deepverb<:f> object for the verb.  This new property is discussed in the section on verb templates (page 
  1353. <:X3,-16384;PageRef VerbTemplates>85<:X~3,-16384;PageRef VerbTemplates>).
  1354. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1355. @Header@<:I0,0,0,0><:S+273><:R1,15,1,418,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#283,6624><:ZCOperators><:Z~COperators>C-Style Operators
  1356. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1357. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>TADS users who are also C programmers often find the substantial similarity between TADS and C to be convenient, but also find the slight differences to be a source of confusion when switching between the two languages.  TADS now offers the option to use C-
  1358. style operators.
  1359. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>First, we've added the remaining C operators to the TADS language:
  1360. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1361. <:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>a % b<:f,QCourier,>    <:f>Returns the remainder of dividing 
  1362. <:f200,QCourier New,>a<:f> by <:f200,QCourier New,>b<:f>
  1363. <:s><:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>a %= b    <:f>Assigns <:f200,QCourier New,>(a % b)<:f> to 
  1364. <:f200,QCourier New,>a<:f>
  1365. <:s><:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>a != b    <:f>Equivalent to <:f200,QCourier New,>(a <<<;> b)<:f>
  1366. <:s><:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>!a    <:f>Equivalent to <:f200,QCourier New,>(not a)<:f>
  1367. <:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>a & b<:f>    Bitwise AND
  1368. <:s><:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>a &= b<:f>    sets <:f200,QCourier New,>a<:f> to 
  1369. <:f200,QCourier New,>(a & b)<:f>
  1370. <:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>a | b<:f>    bitwise OR
  1371. <:s><:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>a |= b<:f>    sets <:f200,QCourier New,>a<:f> to 
  1372. <:f200,QCourier New,>(a | b)<:f>
  1373. <:s><:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>a && b<:f>    equivalent to <:f200,QCourier New,>(a and b)<:f>
  1374. <:s><:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>a || b<:f>    equivalent to <:f200,QCourier New,>(a or b)<:f>
  1375. <:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>a ^ b<:f>    bitwise XOR of <:f200,QCourier New,>a<:f> and 
  1376. <:f200,QCourier New,>b<:f>
  1377. <:s><:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>a ^= b<:f>    sets <:f200,QCourier New,>a<:f> to 
  1378. <:f200,QCourier New,>(a ^ b)<:f>
  1379. <:s><:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>~a<:f>    bitwise negation of <:f200,QCourier New,>a<:f>
  1380. <:s><:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>a <<<< b<:f>    <:f200,QCourier New,>a<:f> shifted left by 
  1381. <:f200,QCourier New,>b<:f> bits
  1382. <:s><:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>a <<<<= b<:f>    sets <:f200,QCourier New,>a<:f> to 
  1383. <:f200,QCourier New,>(a <<<< b)<:f>
  1384. <:s><:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>a <;><;> b    <:f200,QCourier New,>a<:f> shifted right by 
  1385. <:f200,QCourier New,>b<:f> bits
  1386. <:s><:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>a <;><;>= b<:f>    sets <:f200,QCourier New,>a<:f> to 
  1387. <:f200,QCourier New,>(a <;><;> b)<:f>
  1388. <:s><:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1389. <:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>Some of these operators, such as <:f200,QCourier New,>!<:f>, <:f200,QCourier New,>&&<:f>, and 
  1390. <:f200,QCourier New,>||<:f>, are merely synonyms for existing operators.  The "bitwise" operators act on numeric values rather than logical values; they treat their operands as bit vectors, and apply the operation to each bit of the numbers.  For example, 
  1391. <:f200,QCourier New,>3 & 2<:f> has the value 2, since the bit patterns are "011" and "010," respectively.  The bit-shift operations are equivalent to multiplying or dividing by a power of 2:  
  1392. <:f200,QCourier New,>1 <<<< 5<:f> has the value 32, since it's equivalent to multiplying 1 by 2 raised to the 5th power.
  1393. <:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>In addition, TADS now has a mode which uses the C-style assignment operator.  Normally, the TADS assignment operator is 
  1394. <:f200,QCourier New,>:=<:f>, and the equality operator is <:f200,QCourier New,>=<:f>.  In C, these operators are 
  1395. <:f200,QCourier New,>=<:f> and <:f200,QCourier New,>==<:f> respectively.  You can now tell TADS to use the C-style operators instead of the TADS version.  By default, TADS still uses its own version of the operators.  There are two ways to switch into C-sty
  1396. le operator mode:  by using a command-line option, or by using a new 
  1397. <:f200,QCourier New,>#pragma<:f> compiler directive in your source code.
  1398. <:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>To compile an entire game in C mode, use the <:f200,QCourier New,>-C+<:f> command line option (Macintosh users will find a menu item for C-style operators under the "Options" menu; check this item to enable C operators, and uncheck it to use standard TADS o
  1399. perators).  Using the <:f200,QCourier New,>-C+<:f> compiler option enables C operator mode for the entire game's source code.  (The 
  1400. <:f200,QCourier New,>-C-<:f> option explicitly turns off C operator mode.  This is the default mode.)
  1401. <:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>To specify that a particular file is to be compiled in C mode, you can use the new directive 
  1402. <:f200,QCourier New,>#pragma C+<:f>.  The similar directive <:f200,QCourier New,>#pragma C-<:f> specifies that TADS operator mode is to be used.  These directives can appear anywhere in a source file (outside of comments and strings); they must be alone on 
  1403. the line, and must not be preceded by any whitespace on the line.
  1404. <:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2457,6624>A <:f200,QCourier New,>#pragma<:f> setting affects only the current source file, and any files it includes.  The header files included with TADS (adv.t and std.t) both use TADS operators, so they explicitly specify 
  1405. <:f200,QCourier New,>#pragma C-<:f>; because these directives are limited to the header files, you can freely include adv.t from a file that uses C operator mode without having to worry about setting the mode to or from TADS mode.  Simply 
  1406. <:f200,QCourier New,>#include <<adv.t<;><:f> exactly as you did before--even if your source file uses C mode, adv.t will compile correctly, because it sets the operator mode back to TADS for its own contents, and TADS automatically restores the enclosing fi
  1407. le's mode at the end of adv.t.
  1408. <:s><:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>Note that the C-style operator mode setting affects only the assignment and equality operators.  You can use all of the new C operators (such as the new bitwise operators) in either mode--all of these symbols were invalid in previous versions of TADS, so th
  1409. ere's no danger that they'll be misinterpreted for old games.
  1410. <:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>When the compiler is using C-style assignment operators, it issues a new warning, "possibly incorrect assignment," whenever it finds a statement in this format:
  1411. <:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1412. <:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>if (a = 1)<:f> ...
  1413. <:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1414. <:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#3003,6624>While this statement is legal, with C-style operators it has the effect of assigning the value 1 to 
  1415. <:f200,QCourier New,>a<:f>; since the value of an assignment is the value assigned, this 
  1416. <:f200,QCourier New,>if<:f> will always succeed.  It's a common error for C programmers (even highly experienced ones) to write this type of statement when they really want to compare the values; we originally chose to use "<:f200,QCourier New,>:=<:f>" as t
  1417. he assignment operator in TADS to reduce the likelihood of this type of error.  Now that TADS can be switched to C syntax for assignments and comparisons, we've added the "possibly incorrect assignment" warning to help catch these; the compiler will flag as
  1418. signments made in <:f200,QCourier New,>if<:f>, <:f200,QCourier New,>while<:f>, and 
  1419. <:f200,QCourier New,>do<:f> statements, and in the condition clause of 
  1420. <:f200,QCourier New,>for<:f> statements.  To suppress this warning, you can explicitly test the value of the assignment like this:
  1421. <:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1422. <:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>if ((a = 1) != 0)<:f> ...
  1423. <:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1424. <:s><:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>There are a couple of minor complications with the new operators.
  1425. <:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>First, the <:f200,QCourier New,><;><;><:f> operator can't be used in an expression embedded in a string with the 
  1426. <:f200,QCourier New,><<<< <;><;><:f> construct, because it would be taken for the 
  1427. <:f200,QCourier New,><;><;><:f> that terminates the embedded expression.  Even adding parentheses won't help, because the compiler recognizes the 
  1428. <:f200,QCourier New,><<<< <;><;><:f> construct before it looks at any expression in progress.  So, this type of code won't work:
  1429. <:s><:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1430. <:s><:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>sdesc = "a / 128 = <<<< (a <;><;> 7) <;><;>."  
  1431. <:f><:f200,QCourier New,>//Won't work!<:f>
  1432. <:s><:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1433. <:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>Second, the <:f200,QCourier New,>&<:f> operator now has a binary interpretation in addition to its unary interpretation.  For the most part, this won't create any confusion, but there's one situation in which it might:  in lists.  You might have lists in yo
  1434. ur games that look like this:
  1435. <:s><:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1436. <:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>mylist = <[>&prop1 &prop2 &prop3]<:f>
  1437. <:s><:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1438. <:s><:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>In past versions, since the <:f200,QCourier New,>&<:f> operator could only be a unary operator, this construct was unambiguous; however, now that 
  1439. <:f200,QCourier New,>&<:f> can be a binary operator, this could be interpreted either as three expressions involving unary 
  1440. <:f200,QCourier New,>&<:f> operators, or as a single expression involving one unary 
  1441. <:f200,QCourier New,>&<:f> operator and two binary <:f200,QCourier New,>&<:f> operators. 
  1442. <:s><:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>For compatibility with past versions, TADS will interpret the <:f200,QCourier New,>&<:f> operators as 
  1443. <+">unary<-"> operators.  When it finds this construct, though, it will warn you that it is ambiguous.  (The new warning is TADS-357, "operator '&' interpreted as unary in list.)  You can suppress this warning in one of two ways.  First, you can render the 
  1444. list unambiguous.  To do this, use a comma between each pair of list elements:
  1445. <:s><:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1446. <:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>mylist = <[>&prop1, &prop2, &prop3]<:f>
  1447. <:s><:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1448. <:s><:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Note that if you actually want the binary interpretation, you should simply enclose the expression in parentheses:
  1449. <:s><:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1450. <:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>mylist = <[>(2 & 3 & 4)]<:f>
  1451. <:s><:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1452. <:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>The other way you can suppress this message is with the new <:f200,QCourier New,>-v-abin<:f> compiler option, which tells the compiler not to generate the warning.  The compiler still interprets the operator the same way when you specify 
  1453. <:f200,QCourier New,>-v-abin<:f>--it just doesn't tell you about it.
  1454. <:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#3003,6624>Note that TADS will treat <+">any<-"></`>operator which has both a unary and binary interpretation as a unary operator when it finds it within a list, and will generate the TADS-357 warning.  For the 
  1455. <:f200,QCourier New,>-<:f> operator, this is a change from past versions, which used the binary interpretation when in a list.  We don't anticipate that this will be a compatibility problem, because the old binary interpretation was almost never desirable, 
  1456. and we think users avoided it; however, if you have an older game, you may wish to compile without the 
  1457. <:f200,QCourier New,>-v-abin<:f> option at least once, and check any lines where the TADS-357 warning is generated for 
  1458. <:f200,QCourier New,>-<:f> or <:f200,QCourier New,>+<:f> operators, to determine if your game's behavior will change with the new version.  Any TADS-357 warnings generated for the 
  1459. <:f200,QCourier New,>&<:f> operator can be safely ignored for a game written with a previous version of TADS.
  1460. <:s><:I0,432,0,0><:S+273><:R1,13,1,1602,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1461. @Header@<:s><:I0,0,0,0><:S+273><:R1,15,1,418,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#283,6624>New Preprocessor Directives
  1462. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1463. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>TADS now lets you define preprocessor symbols.  The <:f200,QCourier New,>#define<:f> directive creates a preprocessor symbol definition:
  1464. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1465. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>#define TEST  "This is a test!"<:f>
  1466. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1467. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>This defines the symbol <:f200,QCourier New,>TEST<:f>, and specifies that this symbol is to be replaced by the text 
  1468. <:f200,QCourier New,>"This is a test!"<:f> whenever it appears (outside of strings or comments) in your source code.  Note that the definition of a symbol need not be a string--the entire text of the rest of the line is assigned to the symbol.
  1469. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>You can use a preprocessor symbol that you've defined simply by putting the symbol in your code:
  1470. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1471. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>sdesc =
  1472. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>{
  1473. <:s><:I0,432,0,0><:S+273><:R1,15,1,785,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    TEST;
  1474. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>}<:f>
  1475. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1476. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>When the compiler encounters the preprocessor symbol, it replaces the symbol with its definition, so the compiler treats this the same as:
  1477. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1478. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>sdesc =
  1479. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>{
  1480. <:s><:I0,432,0,0><:S+273><:R1,15,1,796,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    "This is a test!";
  1481. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>}<:f>
  1482. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1483. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>You can delete a preprocessor symbol that you've defined using the 
  1484. <:f200,QCourier New,>#undef<:f> directive:
  1485. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1486. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>#undef TEST<:f>
  1487. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1488. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>The compiler automatically defines a number of preprocessor symbol:
  1489. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624><:f200,QCourier New,>__TADS_VERSION_MAJOR<:f> is defined as the major version number of the current compiler.  (Note that this symbol starts with 
  1490. <+">two<-"></`>underscore characters, as do most of the symbols that the compiler defines for you.)  Currently, this is defined as 2.
  1491. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>__TADS_VERSION_MINOR<:f> is the minor version number, currently 2.
  1492. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624><:f200,QCourier New,>__TADS_SYSTEM_NAME<:f> is defined as a single-quoted string giving the name of the current system.  For DOS systems, this is 
  1493. <:f200,QCourier New,>'MSDOS'<:f>; for Macintosh systems, this is <:f200,QCourier New,>'Macintosh'<:f>.  TADS also defines the value of this symbol as a symbol itself--on MSDOS systems, the compiler defines the symbol 
  1494. <:f200,QCourier New,>MSDOS<:f>, and on Macintosh systems, the compiler defines 
  1495. <:f200,QCourier New,>Macintosh<:f>.  (The value of the system name symbol is simply 1; it's purpose is to allow for conditional compilation, so the value isn't important.)
  1496. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624><:f200,QCourier New,>__DEBUG<:f> is defined if the game is being compiled for debugging (with the 
  1497. <:f200,QCourier New,>-ds<:f> command line option).  By testing this symbol with 
  1498. <:f200,QCourier New,>#ifdef<:f>, you can easily include parts of your game (such as special "magic" verbs that you use for debugging) only in testing versions of your game, without having to worry about removing them manually when producing the final versio
  1499. n of the game for players.  The value of this symbol is 1 if it's defined; the purpose of this symbol is to allow for conditional compilation, so its value isn't important.
  1500. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624><:f200,QCourier New,>__DATE__<:f> is defined as a single-quoted string giving the date when the current compilation began, in the format 
  1501. <:f200,QCourier New,>'Jan 01 1994'<:f>.
  1502. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624><:f200,QCourier New,>__TIME__<:f> is defined as a single-quoted string giving the time when the current compilation began, in the 24-hour format 
  1503. <:f200,QCourier New,>'01:23:45'<:f>.  The time isn't updated during the course of a compilation--it's always the time when compilation began.
  1504. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624><:f200,QCourier New,>__FILE__<:f> is defined as a single-quoted string giving the name of the current source file being compiled.
  1505. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624><:f200,QCourier New,>__LINE__<:f> is defined as a number giving the line number currently being compiled.
  1506. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>You can define symbols from the compiler command line.  The new -D option lets you specify a symbol to define, and optionally a value.  Specify the symbol, then an equals sign, then the value; if you omit the equals sign, the default value is 1.  For exampl
  1507. e, to define the symbol DEMO from the command line, you could use this command:
  1508. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1509. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>tc -DDEMO mygame<:f>
  1510. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1511. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>You can also specifically delete preprocessor symbols that the compiler defines (other than 
  1512. <:f200,QCourier New,>__FILE__<:f> or <:f200,QCourier New,>__LINE__<:f>).  You can also undefine any symbols defined earlier on the command line with 
  1513. <:f200,QCourier New,>-D<:f> options, which may be useful if you're using a configuration file that defines certain symbol.  To undefine a symbol, use the -U option:
  1514. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1515. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>tc -UDEMO mygame<:f>
  1516. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1517. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>If the symbol <:f200,QCourier New,>DEMO<:f> was defined earlier on the command line, the definition is deleted.
  1518. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>The Macintosh compiler has a new preprocessor options dialog that you can access from the "Options" menu.  You can use this dialog to enter symbols to define; in the text box, simply list the symbols (one per line) that you wish to define.  If you want to a
  1519. ssign values to these symbols, use an equals sign, followed by the value.  Another text box in the same dialog lets you list pre-defined symbols that you want to delete; simply list the symbols to be deleted, one per line.
  1520. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>You can test for the existence of a preprocessor symbol with <:f200,QCourier New,>#ifdef<:f> ("if defined") and you can test to see if a preprocessor symbol is 
  1521. <+">undefined<-"></`>with the <:f200,QCourier New,>#ifndef<:f> ("if 
  1522. <+">not<-"></`>defined") directive.  These directives let you conditionally include code in your program, depending on whether or not a symbol is defined.  For example:
  1523. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1524. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>#ifdef TEST
  1525. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>sdesc = <:f><:f200,QCourier New,>{<:f><:f200,QCourier New,> TEST; 
  1526. <:f><:f200,QCourier New,>}
  1527. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>#endif<:f>
  1528. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1529. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>The code between the <:f200,QCourier New,>#ifdef<:f> and the <:f200,QCourier New,>#endif<:f> is included only if the preprocessor symbol 
  1530. <:f200,QCourier New,>TEST<:f> is defined.  There's also a <:f200,QCourier New,>#else<:f> directive, which lets you include a block of lines if the most recent condition failed.
  1531. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#3003,6624>Conditional compilation is particularly useful with the symbols you define from the command line with the 
  1532. <:f200,QCourier New,>-D<:f> option, since it allows you to write your game in such a way that certain features are enabled when you use a particular set of 
  1533. <:f200,QCourier New,>-D<:f> options.  This allows you to use a single set of source files, but produce a variety of different .GAM files.  For example, if you want to be able to generate a subset of your game as a demo, you could use conditional compilation
  1534.  to include or discard sections of the game depending on whether you're compiling the demo or the full game.  Similarly, you could use conditional compilation to include certain features only when you're compiling a debugging version of your game; note that
  1535.  the compiler makes this even easier, because it defines the symbol 
  1536. <:f200,QCourier New,>__DEBUG<:f> when you're compiling with debugging symbols.
  1537. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>We've also added the <:f200,QCourier New,>#error<:f> directive.  This directive lets you generate an error from within your game.  Any text following the 
  1538. <:f200,QCourier New,>#error<:f> on the line is displayed to the user as the text of the error message.  For example:
  1539. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1540. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>#ifndef TEST
  1541. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>#error TEST is not defined!
  1542. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>#endif<:f>
  1543. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1544. @Header@<:s><:I0,0,0,0><:S+273><:R1,15,1,418,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#283,6624>New Output Escape Sequences
  1545. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1546. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>The output formatter now recognizes two new escape sequences.
  1547. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#3003,6624>The first is "<:f200,QCourier New,>\-<:f>" (a backslash followed by a hyphen), and was added in version 2.1.  This sequence tells the output formatter to pass the following two bytes as-is, without any interpretation.  This is useful for multi-byte characte
  1548. r sets (such as on a Japanese-localized Macintosh), where a single character may be represented by two bytes.  For the most part, you can freely mix single- and double-byte characters within text strings without any special work.  However, some double-byte 
  1549. characters contain the ASCII code for a backslash as one of their two bytes; in these cases, the output formatter incorrectly interprets the byte whose code is "<:f200,QCourier New,>\<:f>" as introducing an escape sequence.  By preceding such characters wit
  1550. h "<:f200,QCourier New,>\-<:f>",  you can prevent the parser from interpreting the byte with the backslash code as an escape sequence, so the character will be displayed correctly.
  1551. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>The second new escape sequence is "<:f200,QCourier New,>\v<:f>" (a backslash followed by the small letter "v").  This sequence is the opposite of "<:f200,QCourier New,>\^<:f>" (a backslash followed by a circumflex).  Whereas "<:f200,QCourier New,>\^<:f>" co
  1552. nverts the next character displayed to a capital letter, "<:f200,QCourier New,>\v<:f>" converts the next character to a small letter.  Displaying "<:f200,QCourier New,>\v<:f>" is equivalent to calling the 
  1553. <:f200,QCourier New,>nocaps()<:f> built-in function.
  1554. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1555. @Header@<:I0,0,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#283,6624>File Operations
  1556. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1557. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>TADS now has support for reading and writing files from within your game program.  This new feature is intended to let you save information independently of the game-saving mechanism, which allows you to transfer information between sessions of a game, or e
  1558. ven between two different games.
  1559. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>Operations on files are all performed through a <+">file handle<-">.  This is a special value, generated by TADS, that you use to refer to a file.  TADS creates a file handle when you 
  1560. <+">open<-"> a file; once you've opened a file and obtained its file handle, you can read and write the file.  Once you're done with the file, you close the file, which deletes the file handle.
  1561. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>To open a file, use the <:f200,QCourier New,>fopen()<:f> function.  This function takes two arguments:  a (single-quoted) string giving the name of the file to open, using local file system conventions, and a "mode." The mode argument is one of these single
  1562. -quoted string values:
  1563. <:I0,360,0,0><:R><:#273,6624>
  1564. <:I0,360,1062,342><:R1,12,1,1062,1,1440,1,2160,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>'r'<:f>    open file for reading; file must already exist
  1565. <:I0,360,1062,342><:R1,12,1,1062,1,1440,1,2160,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624><:f200,QCourier New,>'r+'<:f>    open file for reading and writing; the file is created if it doesn't already exist
  1566. <:I0,360,1062,342><:R1,12,1,1062,1,1440,1,2160,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>'w'<:f>    create a new file for writing; the file is deleted if it already exists
  1567. <:I0,360,1062,342><:R1,12,1,1062,1,1440,1,2160,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624><:f200,QCourier New,>'w+'<:f>    create a new file for reading and writing; the file is deleted if it already exists
  1568. <:I0,360,1062,342><:R1,12,1,1062,1,1440,1,2160,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1569. <:I0,360,0,0><:R><:#819,6624>For  maximum portability, you should avoid using volume names, directories, folders, or other path information in filenames, because any such information might be specific to your computer.
  1570. <:I0,360,0,0><:#1638,6624>The return value of <:f200,QCourier New,>fopen()<:f> is a file handle; you must save the file handle so you can use it later to perform operations on the file.  If the operation fails, and the file cannot be opened as requested, 
  1571. <:f200,QCourier New,>fopen()<:f> returns <:f200,QCourier New,>nil<:f>.  Opening a file could fail for a number of reasons; for example, if you attempt to open a non-existent file with mode 
  1572. <:f200,QCourier New,>'r'<:f>, <:f200,QCourier New,>fopen()<:f> will return 
  1573. <:f200,QCourier New,>nil<:f>, because this mode requires that the file already exists.
  1574. <:I0,360,0,0><:#273,6624>This example opens a new file called TEST.OUT for writing:
  1575. <:I0,360,0,0><:#273,6624>
  1576. <:I0,360,0,0><:#273,6624><:f200,QCourier New,>fnum := fopen('test.out', 'w');<:f>
  1577. <:I0,360,0,0><:#273,6624>
  1578. <:I0,360,0,0><:#273,6624>To close an open file, use <:f200,QCourier New,>fclose()<:f>:
  1579. <:I0,360,0,0><:#273,6624>
  1580. <:I0,360,0,0><:#273,6624><:f200,QCourier New,>fclose(fnum);<:f>
  1581. <:I0,360,0,0><:#273,6624>
  1582. <:I0,360,0,0><:#1092,6624>Once you've closed a file, the file handle is no longer valid; TADS may re-use the same file handle on a subsequent 
  1583. <:f200,QCourier New,>fopen()<:f> call.  Note that the TADS runtime allows only a limited number of files (currently 10) to be open simultaneously, so you should close a file when you're done with it.
  1584. <:I0,360,0,0><:#1638,6624>To write to a file, use <:f200,QCourier New,>fwrite()<:f>.  This function takes a file handle, and a value to write; the value can be a string, a number, or 
  1585. <:f200,QCourier New,>true<:f>.  The value can't be <:f200,QCourier New,>nil<:f> (this is because the 
  1586. <:f200,QCourier New,>fread()<:f> function returns nil to indicate failure; if you could write 
  1587. <:f200,QCourier New,>nil<:f> to a file, there would be no way to distinguish reading a valid 
  1588. <:f200,QCourier New,>nil<:f> from an error condition).  fwrite() stores the value, along with information on its type.
  1589. <:I0,360,0,0><:#546,6624>The <:f200,QCourier New,>fwrite()<:f> function returns <:f200,QCourier New,>nil<:f> on success, 
  1590. <:f200,QCourier New,>true<:f> on failure.  If the function returns 
  1591. <:f200,QCourier New,>true<:f>, it usually means that the disk is full.
  1592. <:I0,360,0,0><:#273,6624>
  1593. <:I0,360,0,0><:#273,6624><:f200,QCourier New,>if (fwrite(fnum, 'string value!')
  1594. <:I0,360,0,0><:#273,6624><:f200,QCourier New,>    or fwrite(fnum, 123))
  1595. <:I0,360,0,0><:#273,6624><:f200,QCourier New,>    "Error writing file!";<:f>
  1596. <:I0,360,0,0><:#273,6624>
  1597. <:I0,360,0,0><:#1638,6624>If the file is open for reading, you can read from the file with the 
  1598. <:f200,QCourier New,>fread()<:f> function.  This function takes a file handle, and it returns a value it reads from the file.  The value returned is of the same type as the value originally written at this position in the file with 
  1599. <:f200,QCourier New,>fwrite()<:f>.  If this function returns <:f200,QCourier New,>nil<:f>, it indicates that an error occurred; this usually means that no more information is in the file (which is the case once you've read to the end of the file).
  1600. <:I0,360,0,0><:#273,6624>
  1601. <:I0,360,0,0><:#273,6624><:f200,QCourier New,>res := fread(fnum);
  1602. <:I0,360,0,0><:#273,6624><:f200,QCourier New,>say(res);<:f>
  1603. <:I0,360,0,0><:#273,6624>
  1604. <:I0,360,0,0><:#273,6624>You can get the current byte position in the file with the <:f200,QCourier New,>ftell()<:f> function:
  1605. <:I0,360,0,0><:#273,6624>
  1606. <:I0,360,0,0><:#273,6624><:f200,QCourier New,>"The current seek position is <<<< ftell(fnum) <;><;>. ";<:f>
  1607. <:I0,360,0,0><:#273,6624>
  1608. <:I0,360,0,0><:#546,6624>The <:f200,QCourier New,>ftell()<:f> function returns a number giving the byte position that will be read or written by the next file operation.
  1609. <:I0,360,0,0><:#819,6624>You can set the file position with <:f200,QCourier New,>fseek()<:f> and 
  1610. <:f200,QCourier New,>fseekeof()<:f>.  The <:f200,QCourier New,>fseek()<:f> function moves the file position to a particular byte position, relative to the beginning of the file.  For example, this seeks to the very beginning of a file:
  1611. <:I0,360,0,0><:#273,6624>
  1612. <:I0,360,0,0><:#273,6624><:f200,QCourier New,>fseek(fnum, 0);<:f>
  1613. <:I0,360,0,0><:#273,6624>
  1614. <:I0,360,0,0><:#546,6624>The <:f200,QCourier New,>fseekeof()<:f> function positions the file at its end (EOF stands for "end of file"):
  1615. <:I0,360,0,0><:#273,6624>
  1616. <:I0,360,0,0><:#273,6624><:f200,QCourier New,>fseekeof(fnum);<:f>
  1617. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>Note that you must be careful with <:f200,QCourier New,>fseek()<:f>.  You should only seek to positions that you obtained with the 
  1618. <:f200,QCourier New,>ftell()<:f> function; other positions may be in the middle of a string or a number in the file, so seeking to an arbitrary location and writing could render the file unusable by partially overwriting existing data.
  1619. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2184,6624>Note that the TADS file operations are not designed as general-purpose file system operations; in particular, these new functions don't have any provisions for creating or reading formatted files, or for exchanging information with programs other than TADS 
  1620. games.  TADS reads and writes files in its own binary format, which is portable across platforms--you can take a binary file written on DOS, and read it on the Macintosh; however, the TADS format isn't designed to be interchanged with other programs, or eve
  1621. n to produce simple text files that can be viewed or edited by a user.
  1622. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1623. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1624. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1625. @Header@<:I0,0,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#283,6624>New and Improved Built-In Functions
  1626. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>
  1627. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>addword(<+">obj<-"><+">, <-">&<+">prop, word<-">)<-!>
  1628. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>Adds the <+">word<-"> (a single-quoted string value) to the object as the given part of speech.  The 
  1629. <+">prop<-"></`>parameter can be <:f200,QCourier New,>noun<:f>, <:f200,QCourier New,>adjective<:f>, 
  1630. <:f200,QCourier New,>plural<:f>, <:f200,QCourier New,>verb<:f>, <:f200,QCourier New,>article<:f>, or 
  1631. <:f200,QCourier New,>preposition<:f>.  You can add words to any object, including objects defined statically in your game, as well as objects created dynamically at run-time.
  1632. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>For examples of using this function, see the section on Dynamic Vocabulary (page 
  1633. <:X3,-16384;PageRef DynamicVocabulary>8<:X~3,-16384;PageRef DynamicVocabulary>).
  1634. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1635. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>clearscreen<-!><+!>()<-!>
  1636. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>Clears the screen.  Note that this function may have no effect on some platforms; for example, when the DOS runtime is operating in plain ASCII mode, 
  1637. <:f200,QCourier New,>clearscreen()<:f> will have no effect.
  1638. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>
  1639. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>debugTrace(1, <+">flag<-">)<-!>
  1640. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>This new form of <:f200,QCourier New,>debugTrace<:f> lets you turn a new player command parser diagnostic mode on and off.  If 
  1641. <+">flag<-"> is <:f200,QCourier New,>true<:f>, this function activates the new diagnostic mode; if 
  1642. <+">flag<-"> is <:f200,QCourier New,>nil<:f>, it turns the diagnostic mode off.
  1643. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2457,6624>When the new diagnostic mode is active, the parser generates a series of progress messages as it analyzes the player's command.  These messages provide information on how the parser interprets the words in the command.  When first reading a sentence, the pa
  1644. rser displays all possible parts of speech for each word.  As the parser further analyzes the sentence, it displays information on each noun phrase:  the words involved, the part of speech that the parser uses for each word in the noun phrase (when a word c
  1645. an be used as multiple parts of speech, the parser chooses one part of speech as it reads the noun phrase), and the objects that match the words in the noun phrase.
  1646. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>The parser diagnostic mode may help you track down problems in which the parser refuses to recognize certain noun phrases that you would expect to be valid.  Since the parser chooses among ambiguous interpretations of words, it's frequently helpful to under
  1647. stand exactly how the parser is interpreting your commands; this new debugging mode should make it easier to gain this understanding.
  1648. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>This new mode is available in the standard runtime as well as the debugger, so 
  1649. <:f200,QCourier New,>debugTrace(1,<:f> <+">flag<:f200,QCourier New,><-">)<:f>always succeeds.  The function returns no value.
  1650. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>The original <:f200,QCourier New,>debugTrace()<:f> function still works as it always has.
  1651. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1652. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>delword(<-!><+!><+">obj<-"><+">, <-">&<+">prop, word<-">)<-!>
  1653. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>Deletes the <+">word<-"> (a single-quoted string value) from the object's vocabulary for the given part of speech.  The 
  1654. <+">prop<-"></`>parameter can be <:f200,QCourier New,>noun<:f>, <:f200,QCourier New,>adjective<:f>, 
  1655. <:f200,QCourier New,>plural<:f>, <:f200,QCourier New,>verb<:f>, <:f200,QCourier New,>article<:f>, or 
  1656. <:f200,QCourier New,>preposition<:f>.  You can delete words from any object, including objects defined statically in your game, as well as objects created dynamically at run-time.  Furthermore, you can delete words that were added dynamically, as well as wo
  1657. rds that were statically defined in your game.
  1658. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>For examples of using this function, see the section on Dynamic Vocabulary (page 
  1659. <:X3,-16384;PageRef DynamicVocabulary>8<:X~3,-16384;PageRef DynamicVocabulary>).
  1660. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1661. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>firstsc(<+">obj<-">)<-!>
  1662. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>Returns the first superclass of the given object.  Returns <:f200,QCourier New,>nil<:f> if the object has no superclass (which will only be the case if the object was defined as being of type 
  1663. <:f200,QCourier New,>object<:f>).
  1664. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>This function is provided primarily to facilitate handling equivalent objects.  In conjunction with the 
  1665. <:f200,QCourier New,>isEquivalent<:f> property, this function lets you determine if two objects are indistinguishable from one another.  If two objects have the same immediate superclass, and they both have the 
  1666. <:f200,QCourier New,>isEquivalent<:f> property set to <:f200,QCourier New,>true<:f>, the two objects are equivalent.
  1667. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1668. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>fclose(<+">filehandle<-">)
  1669. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Closes the file indicated by <+">filehandle<-">.  Once the file is closed, no further operations on 
  1670. <+">filehandle<-"> are valid.
  1671. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>
  1672. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>fopen(<+">filename, mode<-">)
  1673. <+C><:I0,432,0,0><:R><:#819,6624>Opens the file whose name is given by the single-quoted string value 
  1674. <+">filename<-">; the file is opened in a manner according to the 
  1675. <+">mode<-"> argument, which is a single-quoted string value:
  1676. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1677. <:I0,432,1062,342><:R1,12,1,1062,1,1440,1,2160,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>'r'<:f>    open file for reading; file must already exist
  1678. <:I0,432,1062,342><:R1,12,1,1062,1,1440,1,2160,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624><:f200,QCourier New,>'r+'<:f>    open file for reading and writing; the file is created if it doesn't already exist
  1679. <:I0,432,1062,342><:R1,12,1,1062,1,1440,1,2160,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>'w'<:f>    create a new file for writing; the file is deleted if it already exists
  1680. <:I0,432,1062,342><:R1,12,1,1062,1,1440,1,2160,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624><:f200,QCourier New,>'w+'<:f>    create a new file for reading and writing; the file is deleted if it already exists
  1681. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1682. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>The function returns a file handle that is used in subsequent file operations (<:f200,QCourier New,>fwrite()<:f>, 
  1683. <:f200,QCourier New,>fread()<:f>, <:f200,QCourier New,>fclose()<:f>, and the like) to refer to the open file.
  1684. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>If the operation fails, <:f200,QCourier New,>fopen()<:f> returns <:f200,QCourier New,>nil<:f>.  This function can fail for a number of reasons; for example, if you attempt to open a file that doesn't exist with mode 
  1685. <:f200,QCourier New,>'r'<:f>, the operation will fail because this mode can only be used to open an existing file.
  1686. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1687. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>fread(<+">filehandle<-!><-"><+!><-">)
  1688. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>Reads the next data item from the file and returns its value.  The value will be of the same type as that originally written at the current position in the file with 
  1689. <:f200,QCourier New,>fwrite()<:f>.  If an error occurs, this function returns 
  1690. <:f200,QCourier New,>nil<:f>; this usually indicates that you are attempting to read past the end of the file.
  1691. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>
  1692. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>fseek(<+">filehandle, byteposition<-">)
  1693. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>Seeks to a byte position in the file.  The <+">byteposition<-"> value should be a value previously returned by 
  1694. <:f200,QCourier New,>ftell()<:f>, since other values may not correspond to a value in the file. 
  1695. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>
  1696. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>fseekeof(<+">filehandle<-">)
  1697. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>Positions the file at its end.
  1698. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>
  1699. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>ftell(<+">filehandle<-">)
  1700. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Returns the current seek position in the file, given as a number of bytes from the beginning of the file.
  1701. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>
  1702. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>fwrite(<+">filehandle, value<-">)
  1703. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>Writes the given value to the file.  The <+">value<-"></`>argument must be a number, a single-quoted string, or 
  1704. <:f200,QCourier New,>true<:f>.  Returns <:f200,QCourier New,>nil<+!><:f> 
  1705. <-!>on success, <:f200,QCourier New,>true<:f> on failure; a <:f200,QCourier New,>true<:f> return value usually indicates that the disk is full.
  1706. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>
  1707. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>getwords(<+">obj, <-">&<+">prop<-">)<-!>
  1708. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>This function returns a list of single-quoted strings giving the vocabulary words defined for the given part of speech for the specified object.  The 
  1709. <+">prop<-"></`>parameter can be <:f200,QCourier New,>noun<:f>, <:f200,QCourier New,>adjective<:f>, 
  1710. <:f200,QCourier New,>plural<:f>, <:f200,QCourier New,>verb<:f>, <:f200,QCourier New,>article<:f>, or 
  1711. <:f200,QCourier New,>preposition<:f>.
  1712. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>For examples of using this function, see the section on Dynamic Vocabulary (page 
  1713. <:X3,-16384;PageRef DynamicVocabulary>8<:X~3,-16384;PageRef DynamicVocabulary>).
  1714. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1715. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1716. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1717. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>getfuse(<+">funcptr, parm<-">)<-!>  <+!>(2.1)<-!>
  1718. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>The new function <:f200,QCourier New,>getfuse(<:f><+">funcptr, parm<:f200,QCourier New,><-">)<:f> lets you determine if the indicated fuse is still active, and if so, how many turns are left until it is activated.  If the fuse is not active (it has already 
  1719. fired, or it has been removed with a call to r<:f200,QCourier New,>emfuse<:f>, or it was simply never set), the function returns 
  1720. <:f200,QCourier New,>nil<:f>.  Otherwise, it returns the number of turns before the fuse is activated.
  1721. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1722. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>getfuse(<+">obj, &msg<-">)  (2.1)<-!>
  1723. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>This form of <:f200,QCourier New,>getfuse()<:f> lets you check on a fuse set with the 
  1724. <:f200,QCourier New,>notify()<:f> function.  If the fuse is not active, the function returns 
  1725. <:f200,QCourier New,>nil<:f>, otherwise it returns the number of turns before the fuse is activated.
  1726. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1727. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>gettime<-!><+!>()  (2.1)<-!>
  1728. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Returns the current system clock time.  The time is returned as a list of numeric values for easy processing.  The list elements are:
  1729. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1730. <+C><:s><:I0,432,0,0><:S+273><:R1,14,1,72,1,882,1,1872,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><[>1]    year    calendar year (e.g., 1992)
  1731. <+C><:I0,432,0,0><:S+273><:R1,14,1,72,1,882,1,1872,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><[>2]    month    month number (1 for January, 2 for February, etc.)
  1732. <+C><:I0,432,0,0><:S+273><:R1,14,1,72,1,882,1,1872,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><[>3]    day    day of the month (1 for the first day)
  1733. <+C><:s><:I0,432,0,0><:S+273><:R1,14,1,72,1,882,1,1872,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><[>4]    weekday    day of the week (1 for Sunday, 2 for Monday, etc.)
  1734. <+C><:I0,432,0,0><:S+273><:R1,14,1,72,1,882,1,1872,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><[>5]    year day    day of the year (1 for January 1)
  1735. <+C><:I0,432,0,0><:S+273><:R1,14,1,72,1,882,1,1872,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><[>6]    hour    hour of the day on a 24-hour clock (0 is midnight)
  1736. <+C><:I0,432,0,0><:S+273><:R1,14,1,72,1,882,1,1872,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><[>7]    minute    minute within the hour (0 to 59)
  1737. <+C><:I0,432,0,0><:S+273><:R1,14,1,72,1,882,1,1872,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><[>8]    second    second within the minute (0 to 59)
  1738. <+C><:s><:I0,432,0,0><:S+273><:R1,14,1,72,1,882,1,1872,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><[>9]    elapsed    seconds since January 1, 1970, 00:00:00 GMT
  1739. <+C><:s><:I0,432,0,0><:S+273><:R1,14,1,72,1,882,1,1872,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1740. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>incturn(<+">num<-">)
  1741. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>This function has been extended to allow you to run a series of turns all at once.  You can now specify a numeric argument to 
  1742. <:f200,QCourier New,>incturn()<:f>; the argument gives the number of turns that should pass.  An argument of 1 is equivalent to calling 
  1743. <:f200,QCourier New,>incturn()<:f> with no arguments.
  1744. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>When an argument higher than 1 is specified, the function runs all of the fuses that are set to turn down within the number of turns specified, but not after that number of turns.  Note that the normal 
  1745. <:f200,QCourier New,>incturn()<:f> doesn't actually execute any fuses, but simply burns all fuses down by one turn.
  1746. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>For example, if you call <:f200,QCourier New,>incturn(2)<:f>, the system will first run any fuses that are set to burn down after 1 turn, then will shorten all remaining fuses by one turn.  Similarly, 
  1747. <:f200,QCourier New,>incturn(3)<:f> first runs any fuses that are set to burn down after 1 turn, then runs any fuses set to burn down after 2 turns, then shortens any remaining fuses by 2 turns.
  1748. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Fuses set with <:f200,QCourier New,>setfuse()<:f> and <:f200,QCourier New,>notify()<:f> are both affected by this routine.  Note that this function has no effect on daemons.
  1749. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1750. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>inputkey()  (2.1)<-!>
  1751. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#3003,6624>Reads a single keystroke from the keyboard, and returns a string consisting of the character read.  
  1752. <:f200,QCourier New,>inputkey()<:f> takes no arguments.  When called, the function first flushes any pending output text, then pauses the game until the player hits a key.  Once a key is hit, a string containing the character is returned.  Note that this fu
  1753. nction does <+">not<-"> provide a portable mechanism for reading non-standard keys, such as cursor arrow keys and function keys.  If the user hits a non-standard key, the return value is the representation of the key on the operating system in use.  To ensu
  1754. re portability, you should use this function only with standard keys (alphabetic, numeric, and punctuation mark keys).  Note that you will encounter no portability problems if you simply ignore the return value and use 
  1755. <:f200,QCourier New,>inputkey()<:f> only to pause and wait for a key.
  1756. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Note that <:f200,QCourier New,>inputkey()<:f> takes its input directly from the keyboard.  It does 
  1757. <+">not<-"></`>look at the command line
  1758. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1759. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>intersect(<+">list1, list2<-">)  (2.1)<-!>
  1760. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Returns the intersection of two lists--that is, the list of items in both of the two lists provided as arguments.  For example:
  1761. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1762. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>intersect(<[>1 2 3 4 5 6], <[>2 4 6 8 10])<:f>
  1763. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1764. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>yields the list <:f200,QCourier New,><[>2 4 6]<:f>.
  1765. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>Note that the behavior for lists with repeated items is not fully defined with respect to the number of each repeated item that will appear in the result list.  In the current implementation, the number of repeated items that is present in the 
  1766. <+">shorter<-"></`>of the two source lists will be the number that appears in the result list; however, this behavior may change in the future, so you should try not to depend on it.
  1767. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1768. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>nocaps()<-!>
  1769. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>This function is the opposite of <:f200,QCourier New,>caps()<:f>--it specifies that the next character displayed will be converted to lower case.  Note that you can use the new escape sequence "<:f200,QCourier New,>\v<:f>" to achieve the same effect.
  1770. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>Note that calls to <:f200,QCourier New,>caps()<:f> and <:f200,QCourier New,>nocaps()<:f> override one another; if you call 
  1771. <:f200,QCourier New,>caps()<:f>, and then immediately call <:f200,QCourier New,>nocaps()<:f>, the next character displayed will be lower-case--the call to 
  1772. <:f200,QCourier New,>caps()<:f> is forgotten after the call to <:f200,QCourier New,>nocaps()<:f>. 
  1773. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1774. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>objwords<-!><+!>(<+">num<-">)<-!><+!>  (2.1)<-!>
  1775. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>Provides a list of the actual words the user typed to refer to an object used in the current command.  The argument 
  1776. <+">num<-"> specifies which object you're interested in:  1 for the direct object, or 2 for the indirect object.  The return value is a list of strings; the strings are the words used in the command (converted to lower case, stripped of any spaces or punctu
  1777. ation).  If a special word such as "it," "them," or "all" was used to specify the object, the list will have a single element, which is the special word used.
  1778. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>For example, if the player types "take all," then <:f200,QCourier New,>objwords(1)<:f> will return 
  1779. <:f200,QCourier New,><[>'all']<:f> and <:f200,QCourier New,>objwords<[>2]<:f> will return 
  1780. <:f200,QCourier New,><[>]<:f>.  Note that <:f200,QCourier New,>objwords(1)<:f> will return 
  1781. <:f200,QCourier New,><[>'all']<:f> even if the player typed a variation on "all," such as "take everything" or "take all but the book."
  1782. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>If the player types "put all in red box," the <:f200,QCourier New,>objwords(1)<:f> returns 
  1783. <:f200,QCourier New,><[>'all']<:f> and <:f200,QCourier New,>objwords(2)<:f> returns 
  1784. <:f200,QCourier New,><[>'red' 'box']<:f>.
  1785. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>If the player uses multiple direct objects, the function will return the 
  1786. <+">current<-"></`>object's words only.  For example, if the player types "put blue folder and green book in red box," 
  1787. <:f200,QCourier New,>objwords(1)<:f> will return <:f200,QCourier New,><[>'blue' 'folder']<:f> while the first direct object is being processed, and 
  1788. <:f200,QCourier New,><[>'green' 'book']<:f> while the second object is being processed.
  1789. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>This function could potentially be useful in such cases as "ask <+">actor<-"> about 
  1790. <+">object<-">," because it allows you to determine much more precisely what the player is asking about than would otherwise be possible.
  1791. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>You can call <:f200,QCourier New,>objwords()<:f> during a verb verification or action method (<:f200,QCourier New,>verDo<+"><:f>Verb<-">, 
  1792. <:f200,QCourier New,>verIo<+"><:f>Verb<-">, <:f200,QCourier New,>do<+"><:f>Verb<-">, 
  1793. <:f200,QCourier New,>io<+"><:f>Verb<-">), and during a <:f200,QCourier New,>doDefault<:f> method.  Note that the return value is slightly different during a 
  1794. <:f200,QCourier New,>doD<:f><:f200,QCourier New,>efault<:f> method:  if the word "all" is used in the command, the function will return the list 
  1795. <:f200,QCourier New,><[>'A']<:f> rather than <:f200,QCourier New,><[>'all']<:f>, due to the internal order of processing of the word list.
  1796. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1797. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>objwords(1) words with doDefault
  1798. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624><-">You can now call <:f200,QCourier New,>objwords(1)<+!><-"><:f> 
  1799. <-!>from within the <:f200,QCourier New,>doDefault<:f> method, as described above.  Until version 2.2, you could call 
  1800. <:f200,QCourier New,>objwords(1)<:f> only from verb verification and action methods.
  1801. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>
  1802. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>
  1803. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>outhide(<+">flag<-">)  (2.1)<-!>
  1804. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2457,6624>Turns hidden output on or off, simulating the way the parser disambiguates objects.  The parameter 
  1805. <+">flag<-"> is either <:f200,QCourier New,>true<:f> or <:f200,QCourier New,>nil<:f>.  When you call 
  1806. <:f200,QCourier New,>outhide(true)<:f>, the system starts hiding output.  Subsequent output is suppressed--it won't be shown to the player.  When you call 
  1807. <:f200,QCourier New,>outhide(nil)<:f>, the system stops hiding output--subsequent output is once again displayed.  
  1808. <:f200,QCourier New,>outhide(nil)<:f> also returns a value indicating whether any (suppressed) output was generated since the call to 
  1809. <:f200,QCourier New,>outhide(true)<:f>, which allows you to determine whether any output 
  1810. <+">would<-"></`>have resulted from the calls made between <:f200,QCourier New,>outhide(true)<:f> and 
  1811. <:f200,QCourier New,>outhide(nil)<:f>.
  1812. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>This is the same mechanism used by the parser during disambiguation, so it should 
  1813. <+">not<-"></`>be called by a <:f200,QCourier New,>verDo<+"><:f>Verb<-"> or 
  1814. <:f200,QCourier New,>verIo<+"><:f>Verb<-"> method.  This function is provided to allow you to make calls to 
  1815. <:f200,QCourier New,>verDo<+"><:f>Verb<-"> and <:f200,QCourier New,>verIo<+"><:f>Verb<-"> to determine if they will allow a particular verb with an object, just as the parser does.
  1816. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>There is no way to recover the text generated while output is being hidden.  The only information available is whether any text was generated.
  1817. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1818. <+C><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>outhide(<+">flag<-">)--nested calls<-!>
  1819. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>When you call <:f200,QCourier New,>outhide(true)<:f>, the function returns a status indicator, which is a value that can be used in a subsequent call to 
  1820. <:f200,QCourier New,>outhide()<:f> to restore output hiding to the state it was in before the 
  1821. <:f200,QCourier New,>outhide(true)<:f>.  This allows you to nest text hiding--you can hide output in a subroutine or method call, without interfering with the routine that called you or any routines you call.
  1822. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>To use the nested form, save the return value of <:f200,QCourier New,>outhide(true)<:f>, and then use the saved value as the parameter--in place of 
  1823. <:f200,QCourier New,>nil<:f>--to the subsequent call to <:f200,QCourier New,>outhide()<:f>.  The value returned by the second 
  1824. <:f200,QCourier New,>outhide()<:f> indicates whether any text output occurred 
  1825. <+">between the nested calls.<-">  For example:
  1826. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>
  1827. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>local old_stat1, old_stat2;
  1828. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>local new_stat1, new_stat2;
  1829. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>
  1830. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>old_stat1 := outhide(true);
  1831. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>"This is some hidden test.";
  1832. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>old_stat2 := outhide(true);
  1833. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>// don't write any text here
  1834. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>new_stat2 := outhide(old_stat2);
  1835. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>new_stat1 := outhide(old_stat1);<:f>
  1836. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1837. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>Because <:f200,QCourier New,>outhide(old_stat2)<:f> indicates whether any output occurred during the 
  1838. <+">nested<-"> <:f200,QCourier New,>outhide(true)<:f>, <:f200,QCourier New,>new_stat2<:f> is 
  1839. <:f200,QCourier New,>nil<:f>.  However, <:f200,QCourier New,>new_stat1<:f> is 
  1840. <:f200,QCourier New,>true<:f>, since output occurred after the first 
  1841. <:f200,QCourier New,>outhide(true)<:f>.  Consider another sequence:
  1842. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1843. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>old_stat1 := outhide(true);
  1844. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>// write no text here
  1845. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>old_stat2 := outhide(true);
  1846. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>"This is some hidden text.";
  1847. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>new_stat2 := outhide(old_stat2);
  1848. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>new_stat1 := outhide(old_stat1);<:f>
  1849. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1850. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>In this case, both <:f200,QCourier New,>new_stat1<:f> and <:f200,QCourier New,>new_stat2<:f> will be true, because hidden output occurred within both nested sections (even though only a single message was displayed, it was within both nested sections).
  1851. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>The general form of a nested <:f200,QCourier New,>outhide()<:f> section is:
  1852. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1853. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>{
  1854. <+C><:I0,432,0,0><:S+273><:R1,16,1,72,1,818,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    local old_stat;
  1855. <+C><:I0,432,0,0><:S+273><:R1,16,1,72,1,818,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    local new_stat;
  1856. <+C><:s><:I0,432,0,0><:S+273><:R1,16,1,72,1,818,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>
  1857. <+C><:s><:I0,432,0,0><:S+273><:R1,16,1,72,1,818,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    old_stat := outhide(true);
  1858. <+C><:s><:I0,432,0,0><:S+273><:R1,16,1,72,1,818,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    // do whatever you want here
  1859. <+C><:s><:I0,432,0,0><:S+273><:R1,16,1,72,1,818,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    // output will be hidden
  1860. <+C><:I0,432,0,0><:S+273><:R1,16,1,72,1,818,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    new_stat := outhide(old_stat);
  1861. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>}<:f>
  1862. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1863. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>The <:f200,QCourier New,>new_stat<:f> will indicate whether any output occurred between the 
  1864. <:f200,QCourier New,>outhide(true)<:f> and the <:f200,QCourier New,>outhide(old_stat)<:f>.  In addition, output hiding will be restored to the same state as it was prior to the 
  1865. <:f200,QCourier New,>outhide(true)<:f>.
  1866. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1867. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>rand() is more random<-!>
  1868. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>The random number generator has been improved.  Some people noticed that the old random number generator was producing somewhat less than ideally random results, especially when small upper limits were used.  The interface to the new random number generator
  1869.  is exactly the same as before.
  1870. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>Note that the old random number generator is still used if you don't call 
  1871. <:f200,QCourier New,>randomize()<:f>.  This allows test scripts (which require a fixed sequence of random numbers in order to be repeatable) that were written with older versions of TADS to continue to work unchanged.  If you want numbers from the improved 
  1872. generator, be sure to call <:f200,QCourier New,>randomize()<:f>.
  1873. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1874. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>restart(<+">funcptr, param<-">)  (2.1)<-!>
  1875. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#3549,6624>This new form of <:f200,QCourier New,>restart()<:f> lets you specify a function to be called after restarting the game, but before the 
  1876. <:f200,QCourier New,>init()<:f> function is invoked.  This new feature has been added because it would otherwise be impossible to pass any information across a restart operation:  the 
  1877. <:f200,QCourier New,>restart()<:f> function doesn't return, and all game state is reset to its initial state by 
  1878. <:f200,QCourier New,>restart()<:f>.  You can use this new form of the function if you want a restarted game to have different startup behavior than the game has when it's first started.  Note that adv.t passes a pointer to the 
  1879. <:f200,QCourier New,>initRestart<:f> function (defined in adv.t when it invokes 
  1880. <:f200,QCourier New,>restart()<:f> in response to a "restart" command from the player; the adv.t implementation of 
  1881. <:f200,QCourier New,>initRestart()<:f> simply sets the flag <:f200,QCourier New,>global.restarting<:f> to 
  1882. <:f200,QCourier New,>true<:f> to indicate that the game is being restarted rather than first entered.  You can 
  1883. <:f200,QCourier New,>replace<:f> the <:f200,QCourier New,>initRestart<:f> function defined in adv.t if you want to customize the restart behavior.
  1884. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2730,6624>The <+">param<-"> value is simply passed as the parameter to the function to be called; this allows you to pass information through the restart.  For example, if you start the game with a questionnaire asking the player's name, sex, and age, you could pass 
  1885. a list containing the player's responses to your restart function, and have the restart function store the information without making the player answer the questionnaire again.  The call to 
  1886. <:f200,QCourier New,>restart()<:f> in adv.t uses <:f200,QCourier New,>global.initRestartParam<:f> as the parameter for the 
  1887. <:f200,QCourier New,>initRestart<:f> function; so, if you provide your own version of 
  1888. <:f200,QCourier New,>initRestart<:f>, you can simply store the necessary information in 
  1889. <:f200,QCourier New,>global.initRestartParam<:f> to ensure that it's passed to your function.
  1890. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1891. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>restore(nil)  (2.1)<-!>
  1892. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>This special new form of the <:f200,QCourier New,>restore()<:f> function allows you to choose the time during startup that the player's saved game is restored when the player starts your game with a saved game already specified.  When you call 
  1893. <:f200,QCourier New,>restore(nil)<:f>, the system checks to see if a saved game was specified by the player at startup, and if so, immediately restores the game and returns 
  1894. <:f200,QCourier New,>nil<:f>.  If no game was specified, the function returns 
  1895. <:f200,QCourier New,>true<:f>.
  1896. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2457,6624>Current, it's possible for a player to start a game in this manner only on the Macintosh, but the new 
  1897. <:f200,QCourier New,>restore()<:f> functionality will work correctly on all platforms.  On the Macintosh, the operating system allows an application to be started by opening one of the application's documents from the desktop; the application is started, an
  1898. d is informed that the user wishes to open the specified file.  Saved game files on the Macintosh are associated with the game executable that created them in such a way that the game is executed when a saved game is opened.  This is simply a convenience fe
  1899. ature on the Mac that allows a player to run a game and restore a saved position in a single operation.
  1900. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>You can use <:f200,QCourier New,>restore(nil)<:f> in your <:f200,QCourier New,>init<:f> function to choose the point at which the saved game will be restored.  If your game has extensive introductory text, you could call 
  1901. <:f200,QCourier New,>restore(nil)<:f> prior to displaying your introductory text, and then skip the introductory text if the function returns 
  1902. <:f200,QCourier New,>nil<:f>.
  1903. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>The reason that the system doesn't restore the saved game prior to calling your 
  1904. <:f200,QCourier New,>init<:f> function is that you may want parts of your 
  1905. <:f200,QCourier New,>init<:f> function to be invoked regardless of whether a game is going to be restored or not.  For example, you may want to display your copyright message, or ask a copy-protection question, even when a saved game is going to be restored
  1906. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>If you do not make a call to <:f200,QCourier New,>restore(nil)<:f> in your 
  1907. <:f200,QCourier New,>init<:f> function, TADS will automatically restore the saved game specified by the player immediately 
  1908. <+">after<-"> your <:f200,QCourier New,>init<:f> function returns.  Hence, omitting the call to 
  1909. <:f200,QCourier New,>restore(nil)<:f> doesn't do any harm; this function is provided to give you greater control.
  1910. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1911. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>rundaemons()   (2.1)<-!>
  1912. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Runs all of the daemons.  This function runs daemons set with <:f200,QCourier New,>setdaemon()<:f> and 
  1913. <:f200,QCourier New,>notify()<:f>.  This function returns no value.
  1914. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1915. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>runfuses()  (2.1)<-!>
  1916. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>Runs all expired fuses, if any.  Returns <:f200,QCourier New,>true<:f> if any fuses were ready to run, 
  1917. <:f200,QCourier New,>nil<:f> otherwise.  This function runs fuses set both with 
  1918. <:f200,QCourier New,>setfuse()<:f> and with <:f200,QCourier New,>notify()<:f>.
  1919. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1920. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>setit(nil)<-!>  <+!>(2.1)<-!>
  1921. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>You can now use <:f200,QCourier New,>nil<:f> as the argument to <:f200,QCourier New,>setit()<:f>.  This prevents the player from using "it" in the next command.
  1922. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1923. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>setit(<+">obj, num<-">)<-!><+!>  (2.1)<-!>
  1924. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>You can now specify which pronoun you want to set.  The new optional parameter 
  1925. <+">num<-"> specifies which pronoun to set:  1 for "him," and 2 for "her."  When 
  1926. <+">num<-"> isn't specified, <:f200,QCourier New,>setit(<:f><+">obj<:f200,QCourier New,><-">)<:f> sets "it" as usual.  Note that 
  1927. <:f200,QCourier New,>nil<:f> can be used as the <+">obj<-"> argument to clear "him" or "her," just as it can with "it."
  1928. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1929. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>setit(<+">list<-">)<-!><+!>  (2.1)<-!>
  1930. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>You can now set "them" directly, simply by passing a list of objects (rather than a single object) to 
  1931. <:f200,QCourier New,>setit()<:f>.  Calling <:f200,QCourier New,>setit()<:f> with a list argument has the side effect of clearing "it."
  1932. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1933. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>skipturn(<+">num<-">)<-!>
  1934. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>This function is similar to <:f200,QCourier New,>incturn(<+"><:f>num<:f200,QCourier New,><-">)<:f>; this function 
  1935. <+">skips<-"> the given number of turns, which must be at least 1.  The difference between 
  1936. <:f200,QCourier New,>skipturn()<:f> and <:f200,QCourier New,>incturn()<:f> is that 
  1937. <:f200,QCourier New,>skipturn()<:f> doesn't run any of the fuses that burn down during the turns being skipped--instead, it simply removes them without running them.
  1938. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Fuses set with <:f200,QCourier New,>setfuse()<:f> and <:f200,QCourier New,>notify()<:f> are both affected by this routine.  Note that this function has no effect on daemons.
  1939. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1940. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>verbinfo(<+">deepverb<-">)<-!>
  1941. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>verbinfo(<+">deepverb, prep<-">)<-!>
  1942. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>This function lets you retrieve information on the <:f200,QCourier New,>doAction<:f> and 
  1943. <:f200,QCourier New,>ioAction<:f> definitions for the given <:f200,QCourier New,>deepverb<:f> object.  This function returns a list giving the verification and actor property pointers for the appropriate verb template.  Refer to the section on getting verb 
  1944. information (page <:X3,-16384;PageRef GettingVerbInfo>9<:X~3,-16384;PageRef GettingVerbInfo>) for details on this function.
  1945. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1946. @Header@<+C><:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#283,6624>Debugger Enhancements
  1947. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1948. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>Case Insensitivity in Commands<-!>
  1949. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Commands are no longer case-sensitive.  The command "BP" is now equivalent to "bp."
  1950. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1951. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>Call Logging<-!><+!> (2.1)<-!>
  1952. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>We've added a mechanism that lets you capture a log of all method and function calls, and then inspect the log.  This feature can help you determine the exact sequence of calls that TADS itself makes into your game, and also lets you see how your game and l
  1953. ower-level classes (such as those from adv.t) interact.  Four new command let you control logging (on the Macintosh, these are also accessible from the "Execution" menu):
  1954. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1955. <:s><:I0,432,792,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>c+    Begins call logging.  Any previous call log is cleared, and all subsequent method and function calls and returns will be added to the new call log.
  1956. <:s><:I0,432,792,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>c-    Ends call logging.
  1957. <:s><:I0,432,792,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>cc    Clears the current call log.
  1958. <:s><:I0,432,792,0><:S+273><:R1,15,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>c    Displays the current call log.  Shows all function and method calls after the most recent c+ and up to the current time, or the most recent c-.
  1959. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1960. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>The reason that commands are provided to turn call logging on and off is that the logging process can slow down your game's execution substantially.  When call logging is activated, the system must do extra work every time a function or method is entered or
  1961.  exited.  You should enable call logging at the point you're about to execute a command that you want to trace, then turn it off when you're finished with the command.
  1962. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>Note that the call log is limited in capacity.  If the log becomes full, the oldest information is discarded to make room for new information.  If you leave call logging activated for an extended period of time, information toward the beginning of the log m
  1963. ay be lost.
  1964. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>The lines of text displayed in the call log will be indented to show nesting.  The functions and method called directly by TADS will not be indented at all; anything called by these functions and methods will be indented one space; and so on.  If a function
  1965.  or method has a return value, it will be indicated in the log (prefixed by "<:f200,QCourier New,>=<;><:f>") at the point where the function or method returns.  Each call will show the object and method or function name involved, along with the arguments; t
  1966. he format is the same as in a stack trace.
  1967. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>
  1968. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>Run-time Error Catching<-!><+!> (2.1)<-!>
  1969. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>The debugger will now take control when a run-time error occurs.  The error message will be displayed, and execution will be suspended at the line where the error occurred.  When you resume execution, the current turn will be aborted (as though an 
  1970. <:f200,QCourier New,>abort<:f> statement had been executed).
  1971. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1972. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>Infinite Loop Break-out (2.1)<-!>
  1973. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>You can now break out of an infinite loop in your game.  Hit Ctrl-Break if you're running on a DOS machine, or Command-Period on a Macintosh.  The debugger will take control.
  1974. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1975. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1976. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>Breakpoints in Inherited Methods (2.1)<-!>
  1977. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>The debugger will now stop at a breakpoint in a method inherited by an object.  For example, if you set a breakpoint at 
  1978. <:f200,QCourier New,>room.lookAround<:f>, execution will stop any time a subclass of 
  1979. <:f200,QCourier New,>room<:f> executes the inherited <:f200,QCourier New,>lookAround<:f> method.  Of course, if a subclass overrides the 
  1980. <:f200,QCourier New,>lookAround<:f> method, execution will not stop at 
  1981. <:f200,QCourier New,>room.lookAround<:f>.
  1982. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1983. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>Memory Size Reductions (2.1)<-!>
  1984. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>The run-time memory requirements for the debugger have been reduced, which should allow larger games to be debugged on smaller machines (such as DOS machines) without the out-of-memory conditions that some people have experienced with past versions.
  1985. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1986. @Header@<:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#283,6624>New Compiler Options
  1987. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>
  1988. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>-v <+">level<-">  (2.1)<-!>
  1989. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>This option sets the warning verbosity level.  The default level is 0 (minimum verbosity: suppress warnings which are purely informational or generally do not indicate an actual problem).  Other levels are 1 (suppress purely informational messages, but disp
  1990. lay warnings even when they generally do not indicate a problem), and 2 (maximum verbosity:  display all warnings and informational messages).
  1991. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  1992. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>-fv <+">type<-"><-!>
  1993. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>Sets the .GAM file format.  The <+">type<-"></`>can be <:f200,QCourier New,>a<:f> for file format "A" (used by TADS versions prior to 2.1), 
  1994. <:f200,QCourier New,>b<:f> for format "B" (used by versions 2.1 up to but not including 2.2), 
  1995. <:f200,QCourier New,>c<:f> for format "C" (introduced in version 2.2), or 
  1996. <:f200,QCourier New,>*<:f> for the most recent version (currently "C").  The default is 
  1997. <:f200,QCourier New,>-fv*<:f>.  You can use this option if you wish to compile your game so that it can be used with an earlier version of the TADS runtime.
  1998. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>Version 2.1 of TADS uses file format "B," which is slightly different from the original file format, and 2.2 uses format "C," which differs slightly from "B."  File formats other than "A" will not be accepted by versions of the runtime earlier than 2.1.  Th
  1999. e version 2.2 runtime is able to read any previous file format.
  2000. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>The changes made in version "B" make the .GAM file much more compressible with archiving utilities.  If you use file format "A," your games will not compress very well with programs such as ZIP.
  2001. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>The changes made in version "C" enable the <:f200,QCourier New,>disambigDobjFirst<:f> flag.  If you compile with an earlier file format, you will not be allowed to use this flag.
  2002. <:s><:I0,432,0,0><:R><:#273,6624>
  2003. <:s><:I0,0,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>-e <+">fi<-"><+">le<-"> (2.1)<-!>
  2004. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>This option tells the compiler to log all error messages to <+">file<-">.  The compiler writes all of the messages generated during compilation to the indicated file; the messages will also be displayed on your screen as usual.  The file will be created if 
  2005. it doesn't exist, and it will be overwritten with the new error log if it already exists.
  2006. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2007. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>-C<-!>
  2008. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,>(Note that this is a capital "C.")  This is a toggle option that lets you turn C operator mode on and off (see the section on C operators on page 
  2009. <:X3,-16384;PageRef COperators>20<:X~3,-16384;PageRef COperators>).  The default is 
  2010. <:f200,QCourier New,>-C-<:f>, which enables the standard TADS operators.  If you specify 
  2011. <:f200,QCourier New,>-C+<:f>, TADS will change the assignment operator to "<:f200,QCourier New,>=<:f>" and the equality operator to "<:f200,QCourier New,>==<:f>" to match the C language.
  2012. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2013. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>-v-abin<-!>
  2014. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2184,6624>Disables the warning message "operator <+">x<-"> interpreted as unary in list." (TADS-357).  If you're compiling a game written with a previous version of TADS, and you get this warning, you may want to use 
  2015. <:f200,QCourier New,>-v-abin<:f> to disable the warning.  This warning is intended to notify you that the 
  2016. <+">new<-"></`>meaning of the operator is <+">not<-"></`>being used--in other words, TADS is warning you that it's using an interpretation that's compatible with past versions of the compiler.  If your game was written for an older version of the system, th
  2017. is is exactly what you want, so you probably don't need the warning.
  2018. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2019. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>Improved error checking for -m<-!>
  2020. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>The compiler now checks more carefully to ensure that the memory size settings specified with the various 
  2021. <:f200,QCourier New,>-m<:f> parameters (in particular, <:f200,QCourier New,>-mg<:f>, 
  2022. <:f200,QCourier New,>-mp<:f>, <:f200,QCourier New,>-ml<:f>, <:f200,QCourier New,>-ms<:f>, and 
  2023. <:f200,QCourier New,>-mh<:f>) are valid.  These settings must fit within certain limits, which are now enforced more carefully.  Previous versions of the compiler responded unpredictably to invalid settings.
  2024. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2025. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>-case-<-!>
  2026. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2457,6624>The compiler now lets you turn off case sensitivity.  If you don't want to distinguish between upper- and lower-case letters in your symbols, you can use the 
  2027. <:f200,QCourier New,>-case-<:f> option to turn off the compiler's case sensitivity.  By default, the compiler is set to 
  2028. <:f200,QCourier New,>-case+<:f>, which makes the compiler treat an upper-case letter as distinct from the same letter in lower-case.  When the compiler is case-sensitive, 
  2029. <:f200,QCourier New,>deepverb<:f> and <:f200,QCourier New,>deepVerb<:f> are different symbols.  If you would prefer not to keep track of the exact case of the letters in the symbols defined in your game (or in adv.t), you can make the compiler treat upper- 
  2030. and lower-case letters the same by using <:f200,QCourier New,>-case-<:f>.
  2031. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>Note that adv.t will work either way.  All of the references to a particular symbol in adv.t use the same case, so adv.t will work properly with case sensitivity turned on.  However, adv.t will also work properly with case sensitivity turned off, because it
  2032.  doesn't have any symbols that depend on being in a particular case (for example, it doesn't define one symbol called "a" and a distinct symbol called "A"--if it did, these symbols would collide when compiling without case sensitivity).
  2033. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2034. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>Macintosh Compiler no longer adds ".t" Suffix<-!>
  2035. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>The Macintosh compiler no longer adds a default suffix to input files.  In past versions, the compiler added ".t" to the name of a source file if the source file didn't have any periods in its name.  While adding a default suffix is convenient on other plat
  2036. forms (since it saves the user the trouble of typing the suffix on the command line), it's obviously not desirable on the Macintosh, since the user specifies the file by pointing at it--the full filename is always given, so a suffix shouldn't be added.
  2037. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2038. @Header@<:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#283,6624>Changes to adv.t
  2039. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2040. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>distantItem (2.1)<-!>
  2041. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>The new class <:f200,QCourier New,>distantItem<:f> has been added.  This new class is similar to 
  2042. <:f200,QCourier New,>fixeditem<:f>, except that it's intended to be used to objects that are not actually part of a room, but are 
  2043. <+">visible<-"> from the room in the distance.  For example, you might use this class for distant mountains visible from a location--the player obviously shouldn't be able to do anything to the mountains except look at it them.  A 
  2044. <:f200,QCourier New,>distantItem<:f> can be inspected, but any other attempts to manipulate the object will receive the response "It's too far away."
  2045. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2046. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>scoreStatus (2.1)<-!>
  2047. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>The new <:f200,QCourier New,>scoreStatus(<:f200,QCourier New,><-">points, turns<:f200,QCourier New,>)<:f> function has been added.  This new function simply calls 
  2048. <:f200,QCourier New,>setscore()<:f> with the same arguments.  All other calls to 
  2049. <:f200,QCourier New,>setscore()<:f> in adv.t have been replaced with calls to this new function, which makes it easy to provide a new scoring format, if you wish, simply by using 
  2050. <:f200,QCourier New,>replace<:f> to substitute your own <:f200,QCourier New,>scoreStatus()<:f> function for the one in adv.t.
  2051. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2052. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2053. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>nestedroom.statusPrep, outOfPrep (2.1)<-!>
  2054. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2184,6624>Two new properties have been added to the <:f200,QCourier New,>nestedroom<:f> class:  
  2055. <:f200,QCourier New,>statusPrep<:f>, which displays an appropriate preposition for status line displays while the player is in the nested room; and 
  2056. <:f200,QCourier New,>outOfPrep<:f>, which displays the correct preposition when leaving the nested room.  The default values are "in" for 
  2057. <:f200,QCourier New,>statusPrep<:f> and "out of" for <:f200,QCourier New,>outOfPrep<:f>.  The class 
  2058. <:f200,QCourier New,>beditem<:f> provides values of "on" and "out of" instead.  If you're defining a new subclass of 
  2059. <:f200,QCourier New,>nestedroom<:f>, you can override these properties to provide the most appropriate messages for the subclass.
  2060. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2061. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>fixeditem and "throw" (2.1)<-!>
  2062. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>You can no longer throw a <:f200,QCourier New,>fixeditem<:f> at anything 
  2063. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2064. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>follower changes (2.1)<-!>
  2065. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>The <:f200,QCourier New,>follower<:f> class's <:f200,QCourier New,>actorAction<:f> method now appropriate executes an 
  2066. <:f200,QCourier New,>exit<:f> statement.  In addition, the <:f200,QCourier New,>follower<:f> class now uses 
  2067. <:f200,QCourier New,>dobjGen<:f> and <:f200,QCourier New,>iobjGen<:f> to provide more sensible responses to most verbs.
  2068. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2069. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>clothingItem: "get out of" (2.1)<-!>
  2070. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>You can now "get out of" a piece of clothing; this is equivalent to "take off."
  2071. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2072. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>"l at" (2.1)<-!>
  2073. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>The various verbs which use the word "look" plus a preposition have been modified to allow "l" in place of "look"; this applies to several verbs, including "look at" (which now accepts "l at" as equivalent), "look on," "look in," "look under," "look around,
  2074. " and "look through."
  2075. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2076. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>takeVerb.doDefault (2.1)<-!>
  2077. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>The <:f200,QCourier New,>doDefault<:f> method in <:f200,QCourier New,>takeVerb<:f> has been corrected so that it doesn't return the contents of a closed object.  In previous versions of adv.t, "take all from object" would succeed even when the object was cl
  2078. osed.
  2079. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2080. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>vehicle manipulation from within (2.1)<-!>
  2081. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>The <:f200,QCourier New,>vehicle<:f> class has been corrected so that the player cannot generally manipulate the vehicle while occupying it.  For example, the player can no longer take a vehicle or put it anywhere while inside it.
  2082. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>
  2083. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2084. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>initRestart (2.1)<-!>
  2085. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2457,6624>A new function, <:f200,QCourier New,>initRestart(param)<:f>, has been added.  This function is used when adv.t calls the 
  2086. <:f200,QCourier New,>restart()<:f> built-in function (to start the game over from the beginning) in response to a "restart" command.  The 
  2087. <:f200,QCourier New,>initRestart()<:f> in adv.t simply sets the property 
  2088. <:f200,QCourier New,>global.restarting<:f> to <:f200,QCourier New,>true<:f>.  Your game can inspect this flag in your 
  2089. <:f200,QCourier New,>init<:f> function (or elsewhere) to take a different course of action when restarting a game than when starting up for the first time.  The parameter is not used by adv.t implementation of the function, but if you 
  2090. <:f200,QCourier New,>replace<:f> the <:f200,QCourier New,>initRestart<:f> function defined in adv.t, you might find the parameter useful for passing information through the restart.
  2091. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2092. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>restartVerb (2.1)<-!>
  2093. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2457,6624>The "restart" verb passes a pointer to the <:f200,QCourier New,>initRestart<:f> function when it calls the 
  2094. <:f200,QCourier New,>restart()<:f> built-in function.  This causes 
  2095. <:f200,QCourier New,>initRestart<:f> to be invoked after the game has been restarted, but before the system calls 
  2096. <:f200,QCourier New,>init<:f>.  Note that the call to <:f200,QCourier New,>restart()<:f> passes 
  2097. <:f200,QCourier New,>global.initRestartParam<:f> as the parameter to the 
  2098. <:f200,QCourier New,>initRestart<:f> function.  If you replace <:f200,QCourier New,>initRestart<:f> with your own implementation, and you need to pass some information to this function from the game running before the restart, simply store the necessary inf
  2099. ormation in <:f200,QCourier New,>global.initRestartParam<:f> at any time before restarting, and the information will automatically be passed to your 
  2100. <:f200,QCourier New,>initRestart<:f> function.
  2101. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2102. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>pluraldesc<-!>
  2103. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>We've added the new property <:f200,QCourier New,>pluraldesc<:f> to the class 
  2104. <:f200,QCourier New,>thing<:f> in adv.t.  The definition simply adds an "s" to the end of the sdesc property.  This new property is used by 
  2105. <:f200,QCourier New,>listcont()<:f> when multiple equivalent objects are present in a list; for details, see the information on the changes to 
  2106. <:f200,QCourier New,>listcont()<:f> described in the section on indistinguishable objects (page 
  2107. <:X3,-16384;PageRef Indistinguishables>10<:X~3,-16384;PageRef Indistinguishables>).
  2108. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2109. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>listcont, itemcnt--indistinguishable objects<-!>
  2110. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>The <:f200,QCourier New,>listcont<:f> and <:f200,QCourier New,>itemcnt<:f> functions in adv.t have been enhanced to list multiple occurrences of the same indistinguishable item only once, with the number of such items.  See the section on indistinguishable 
  2111. objects (page <:X3,-16384;PageRef Indistinguishables>10<:X~3,-16384;PageRef Indistinguishables>) for more information.
  2112. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2113. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>"abort" usage changes<-!>
  2114. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>All of the system verbs in adv.t that use the <:f200,QCourier New,>abort<:f> statement have been modified slightly to make it easier to augment their behavior with the 
  2115. <:f200,QCourier New,>modify<:f> statement.  All of the processing other than the 
  2116. <:f200,QCourier New,>abort<:f> has been moved out of the <:f200,QCourier New,>do<:f><+">Verb<-"> (or 
  2117. <:f200,QCourier New,>action<:f>) method, and put into a new method.  For example, the 
  2118. <:f200,QCourier New,>action<:f> method in <:f200,QCourier New,>saveVerb<:f> now looks like this:
  2119. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2120. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>action(actor) =
  2121. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>{
  2122. <:I0,432,0,0><:S+273><:R1,16,1,72,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    self.saveGame(actor);
  2123. <:s><:I0,432,0,0><:S+273><:R1,16,1,72,1,792,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    abort;
  2124. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>}<:f>
  2125. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2126. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>The new method <:f200,QCourier New,>saveGame<:f> in <:f200,QCourier New,>saveVerb<:f> now performs all of the processing that the 
  2127. <:f200,QCourier New,>action<:f> method previously performed.
  2128. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>The benefit of this change is that you can modify the <:f200,QCourier New,>saveGame<:f> method, and inherit the original behavior, without having to worry about an 
  2129. <:f200,QCourier New,>abort<:f> statement interfering with the order of operations.  For example:
  2130. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2131. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>modify restoreVerb
  2132. <:I0,432,0,0><:S+273><:R1,16,1,72,1,785,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    restoreGame(actor) =
  2133. <:s><:I0,432,0,0><:S+273><:R1,16,1,72,1,785,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    {
  2134. <:I0,432,0,0><:S+273><:R1,16,1,72,1,785,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        // restore the game<:f><:f200,QCourier New,>, and<:f><:f200,QCourier New,> check for success
  2135. <:I0,432,0,0><:S+273><:R1,16,1,72,1,785,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        if (inherited.restoreGame(actor))
  2136. <:s><:I0,432,0,0><:S+273><:R1,16,1,72,1,785,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        {
  2137. <:s><:I0,432,0,0><:S+273><:R1,16,1,72,1,785,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>            // re-randomize the puzzle
  2138. <:I0,432,0,0><:S+273><:R1,16,1,72,1,785,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>            "The carnival hawker flashes a mischievous<:f>
  2139. <:I0,432,0,0><:S+273><:R1,16,1,72,1,785,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>            smile at you.  \"There's no use trying to
  2140. <:I0,432,0,0><:S+273><:R1,16,1,72,1,785,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>            guess the answer,\" he says.  \"I changed<:f>
  2141. <:s><:I0,432,0,0><:S+273><:R1,16,1,72,1,785,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>            around the shells while you were busy
  2142. <:I0,432,0,0><:S+273><:R1,16,1,72,1,785,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>            restoring!\"";
  2143. <:I0,432,0,0><:S+273><:R1,16,1,72,1,785,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>            puzzle.answer := rand(100);
  2144. <:s><:I0,432,0,0><:S+273><:R1,16,1,72,1,785,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        }
  2145. <:s><:I0,432,0,0><:S+273><:R1,16,1,72,1,785,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    }
  2146. <:I0,432,0,0><:S+273><:R1,16,1,72,1,785,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>;<:f>
  2147. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2148. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>fmtMe<-!>
  2149. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>The format mask <:f200,QCourier New,>fmtMe<:f> has been added.  You can now use "%me%" in messages to refer to the actor.  For 
  2150. <:f200,QCourier New,>basicMe<:f>, <:f200,QCourier New,>fmtMe<:f> is set to the message "me"; for other actors, it's set to the actor's 
  2151. <:f200,QCourier New,>thedesc<:f>.  In adv.t, <:f200,QCourier New,>thing.ldesc<:f> has been changed to use "%me%":  "It looks like an ordinary <<<<sdesc<;><;> to %me%."  This makes the default sentence somewhat more adaptable if you ask another actor to desc
  2152. ribe something:
  2153. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2154. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><;>guard, look at the card
  2155. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>It looks like an ordinary card to the guard.
  2156. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2157. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>again, wait, sleep are darkverbs<-!>
  2158. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>The verbs "again," "wait," and "sleep" are now all <:f200,QCourier New,>darkVerb<:f> subclasses.  None of these verbs logically requires any light (in fact, one could argue that "sleep" works better in the dark).
  2159. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2160. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>"there" = "it"<-!>
  2161. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>The <:f200,QCourier New,>specialWords<:f> definition in adv.t now adds "there" as a synonym for "it."  This allows commands such as:  "Take the box and put the ball in there."
  2162. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>
  2163. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>isqsurface correction<-!>
  2164. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>The <:f200,QCourier New,>showcontcont()<:f> function no longer displays the contents of an object with the 
  2165. <:f200,QCourier New,>isqsurface<:f> property set to true.
  2166. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2167. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>seethruItem<-!>
  2168. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>We added a new class, <:f200,QCourier New,>seethruItem<:f>, which the player can look through.  This is intended for objects such as windows or magnifying glasses.  If the player looks through the object (with a command such as "look through the window"), t
  2169. he object calls its <:f200,QCourier New,>thrudesc<:f> method to display an appropriate description of what the player sees.  You should customize this method to display an appropriate message for each 
  2170. <:f200,QCourier New,>seethruItem<:f> you create; the default method displays "You can't see much through the window," which obviously won't be what you wanted.
  2171. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>The class <:f200,QCourier New,>thing<:f> previously defined a <:f200,QCourier New,>thrudesc<:f> method as described above.  To preserve compatibility with any existing games that depended on the presence of this method in 
  2172. <:f200,QCourier New,>thing<:f>, we left this as it was.
  2173. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>Note that <:f200,QCourier New,>seethruItem<:f> is <+">not<-"></`>the same as 
  2174. <:f200,QCourier New,>transparentItem<:f>.  The class <:f200,QCourier New,>transparentItem<:f> is for objects whose 
  2175. <+">contents<-"></`>are visible, whereas <:f200,QCourier New,>seethruItem<:f> is for objects that the player can look through.  Use 
  2176. <:f200,QCourier New,>seethruItem<:f> for windows, binoculars, magnifying glasses, and other non-containers.  Use 
  2177. <:f200,QCourier New,>transparentItem<:f> for glass bottles and other transparent containers.
  2178. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2179. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2180. @Header@<:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#283,6624>DOS Color Customization (2.1)
  2181. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2182. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>The player can now customize the colors used by the DOS runtime.  A small new program, TRCOLOR, lets the player select the colors to use while running a game.  The program is self-explanatory:  it displays instructions on-screen, and uses the arrow keys to 
  2183. select colors.  The program lets a player customize the colors to use for the main text area, highlighted text, and the status line.  Type TRCOLOR at the DOS prompt to run the program.
  2184. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>Once you've selected your color scheme, the TRCOLOR program creates a small file called TRCOLOR.DAT in the current directory.  The runtime reads this file at the start of subsequent game sessions.
  2185. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>Note that you can use multiple TRCOLOR.DAT files, in the same way that you can use multiple CONFIG.TC files.  The runtime looks for TRCOLOR.DAT first in the current directory; if no such file exists, the runtime uses the TRCOLOR.DAT in the directory contain
  2186. ing TR.EXE.  This allows you to set up a separate color scheme for each game you're playing, and in addition set up a default color scheme for games with no color schemes of their own.
  2187. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2188. @Header@<:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#283,6624>Improvements to MAKETRX
  2189. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2190. <:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>We've made a couple of changes to the MAKETRX program (on Macintosh, this program is called the "Executable Game Builder").  First, in version 2.1, we simplified the command line for the DOS version by letting you leave off arguments when MAKETRX is able to
  2191.  determine a suitable default.  Second, in version 2.2, we added the ability to "bind" a set of run-time configuration options into your game executable--both the DOS and Macintosh versions provide this new feature.
  2192. <:s><:I0,432,0,0><:S+273><:R1,14,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2193. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>DOS Default Arguments (2.1)<-!>
  2194. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>In version 2.1, we improved the user interface of the DOS version of MAKETRX.  For compatibility with existing makefiles, the old command line syntax is still allowed; however, you can now omit most of the arguments, and MAKETRX will provide suitable defaul
  2195. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>First, you can omit the filename extensions for any of the arguments.  The extension assumed for the TADS runtime executable is ".EXE"; for the game file it is ".GAM"; and for the output (executable) file it is ".EXE".
  2196. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>Second, you can now omit everything except the name of the game file, and the program will attempt to provide defaults.  If you omit the name of the TADS runtime executable, MAKETRX looks for a copy of TR.EXE in the same directory as the MAKETRX program; so
  2197. , if you simply keep all of your TADS executables in a single directory, you don't need to specify the location of TR.EXE when running MAKETRX.  If you omit the destination filename, MAKETRX will use the same name as the game file, with the extension replac
  2198. ed by ".EXE".
  2199. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>The new command line formats for MAKETRX are:
  2200. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2201. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>maketrx mygame<:f>
  2202. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Converts MYGAME.GAM into MYGAME.EXE, using the copy of TR.EXE that resides in the same directory as MAKETRX.EXE.
  2203. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2204. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>maketrx mygame myprog<:f>
  2205. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Converts MYGAME.GAM into MYPROG.EXE, using the copy of TR.EXE that resides in the same directory as MAKETRX.EXE.
  2206. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2207. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>maketrx c:\tads2\tr mygame myprog<:f>
  2208. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Converts MYGAME.GAM into MYPROG.EXE, using C:\TADS2\TR.EXE as the runtime executable.
  2209. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2210. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>Options File Binding<-!>
  2211. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>The MAKETRX command (the Executable Game Builder on the Macintosh) now takes an additional parameter that lets you specify the run-time command options that should be used when the game is executed.  MAKETRX still accepts the original command formats; using
  2212.  one of the old-style command formats will not bind any command options into the resulting .EXE file, in which case the game will use the default runtime settings.
  2213. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>To specify command options for your game executable, you must first create a file containing the command options.  Use the same format as CONFIG.TR--simply enter your options into the file as you would on the TR command line; separate options by newlines or
  2214.  spaces.  For example, to specify a minimal cache size and a swap file of SWAP.DAT, you could make your CONFIG.TR file look like this:
  2215. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2216. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>-m0 -tf swap.dat<:f>
  2217. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2218. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>For DOS users:  Once you've created a file with your command options, specify that file to MAKETRX by using it as the first parameter on the command line, prefixed with an "at" sign (@):
  2219. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2220. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>maketrx @config.tr mygame<:f>
  2221. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2222. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>The @config option can be used with any of the original command formats for MAKETRX.  Once the options file is bound into your executable, its options will be used every time a player runs your game's .EXE file.
  2223. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>For Macintosh users:  an extra dialog has been added at the end of the process of building the application.  This new dialog asks you for the options file you want to bind into your game.  If you don't want to include an options file, simply hit "Cancel."  
  2224. Otherwise, select the file containing the options and hit "OK."  Note that the options file for the Macintosh version is in the same format as for the DOS version; refer to the 
  2225. <+">Author's Manual<-"> for information on the format of the run-time command options.
  2226. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>Note that you may should avoid specifying anything specific to your system in your options file, such as drives or directories, since doing so may prevent the game from working properly on someone else's system.  For example, if you specify the swap file as
  2227.  "D:\SWAP.DAT," the game won't work on a system that doesn't have a "D:" disk, since TADS will be unable to create a swap file on a drive that doesn't exist.
  2228. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2229. @Header@<:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#283,6624>Miscellaneous Runtime Improvements
  2230. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2231. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>DOS:  Ctrl-Left and Ctrl-Right Arrow Keys<-!>
  2232. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>The DOS runtime now lets the player move the cursor to the start of the next word wit control-right arrow, and to the start of the previous word with control-left arrow.  This is consistent with many other DOS command-editing environments.
  2233. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2234. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>DOS Plain ASCII mode<-!>
  2235. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>The DOS runtime now has a plain ASCII mode, in which it uses only DOS character input/output functions.  When in plain ASCII mode, the DOS runtime won't use any low-level I/O functions, such as BIOS or memory-mapped video, but goes entirely through DOS.  Th
  2236. e runtime also won't display the status line or any highlighting.  If you have a special need for DOS-only I/O (for example, if you want to use a voice synthesizer to read the text generated by the game), you can use this mode.
  2237. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>To tell the runtime to use plain ASCII mode, specify <:f200,QCourier New,>-plain<:f> on the runtime command line:
  2238. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2239. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>tr -plain deep<:f>
  2240. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2241. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>You can also specify -plain to an executable game, as long as the game executable was built using a version of the runtime (such as 2.2) that supports the plain ASCII mode:
  2242. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2243. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>deep -plain<:f>
  2244. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2245. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>Hyphenation Improvements<-!>
  2246. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>The output formatter's handling of hyphenation has been improved.  In particular, the output formatter will not split multiple consecutive hyphens across lines; if you use two or three hyphens together as a dash, the formatter will no longer split these up 
  2247. across lines.  In addition, the formatter will keep hyphens at the end of a line, and will not break a line in such a way that it starts with a hyphen.
  2248. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>The Macintosh formatter has been fixed so that it no longer inserts spaces after hyphens when the spaces weren't in the original text.
  2249. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2250. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>Escapes in askfile Prompts<-!>
  2251. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Prompt strings passed to <:f200,QCourier New,>askfile<:f> can now contain 
  2252. <:f200,QCourier New,>\n<:f> and <:f200,QCourier New,>\t<:f> sequences; these sequences are converted properly for display in the dialog.
  2253. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2254. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>DOS f<-!><+!>ile selector bug fix<-!>
  2255. <+C><:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>The DOS file selector has been corrected so that the Alt-key mappings are correct.  In a previous version, the Alt-key mappings were off by one (Alt-B selected the A drive, for example).
  2256. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2257. <:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f,2MinioMM_345 wt 585 wd 12 op,><+!>Macintosh File Selector<:f> "All" Button<-!>
  2258. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>The Macintosh runtime's initial file selector dialog, which lets you specify the game you want to run, now has an "All Files" button.  Clicking this button makes the file selector show 
  2259. <+">all<-"> files, rather than just files that have the special signature that indicates they were created by the Macintosh version of the TADS compiler.  If you've transferred a .GAM file from a non-Macintosh system, you can use the "All Files" button to o
  2260. pen the file--you no longer have to use ResEdit or another file utility to set the creator and type flags in the file.
  2261. <:s><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2262. <:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f,2MinioMM_345 wt 585 wd 12 op,><+!>Status Line on Startup<-!><:f>
  2263. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>The runtime system (on both DOS and Macintosh) no longer displays anything as the game is being initialized.  In previous versions, the runtime displayed "TADS" at the left end of the status line, and "0/0" at the right end, until the game changed the displ
  2264. ay.  This was slightly incongruous for games that changed to a different status line format.  The status line is now completely blank during game initialization.
  2265. <+C><:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2184,6624>Note that this change may have a slight effect on your game:  by default, the score/turn area of the status line will be completely blank until a call to 
  2266. <:f200,QCourier New,>setscore()<:f> is made.  To compensate for this change, we've added a call to 
  2267. <:f200,QCourier New,>scoreStatus(0, 0)<:f> at the beginning of the 
  2268. <:f200,QCourier New,>init<:f> function defined in adv.t.  If you provide your own 
  2269. <:f200,QCourier New,>init<:f> function, you may want to initialize the status line's score display in your 
  2270. <:f200,QCourier New,>init<:f>; if you don't, the status line's score/turn area will be empty until the player enters the first command, at which point the normal turn-counting daemon will usually update the status line.
  2271. <:I0,432,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2272. @Header@<:s><:I0,0,0,0><:S+273><:R1,15,1,72,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#283,6624>Compiler Exit Codes
  2273. <+C><:s><:I0,432,0,0><:S+273><:R1,12,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2274. <+C><:I0,432,0,0><:S+273><:R1,12,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>The compiler now sets system exit codes according to whether any errors occurred during compilation.  If there are no errors (even if there are warnings), the compiler sets the exit code to 0.  If any errors occur, the compiler sets the exit code to a non-z
  2275. ero value.  This makes the compiler work better with "make" utilities, since these utilities usually check the exit code of each command to determine if the operation encountered an error.
  2276. <+C><:s><:I0,432,0,0><:S+273><:R1,12,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>In addition, the compiler will no longer generate a .GAM file if any errors occur.  In the past, the compiler generated a .GAM file in most cases, even when the source file contained errors.  Attempting to run a .GAM file produced from a source file with er
  2277. rors had unpredictable results.
  2278. <+C><:s><:I0,432,0,0><:S+273><:R1,12,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>The Macintosh compiler now displays a different message if a compilation fails or is interrupted than it does when the compilation completes successfully.  The compiler displays "Compilation Terminated" if errors occur; it still displays "Compilation Comple
  2279. ted" upon successful completion without errors.
  2280. <+C><:s><:I0,432,0,0><:S+273><:R1,12,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2281. <:I0,432,0,0><:S+273><:R1,15,1,432,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:p<* >>
  2282. <:I0,432,0,0><:S+273><:R1,15,1,432,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:h<**>
  2283. <:R1,3,2,3312,3,6517,3,9360,>    <+">The New Book of the Parser    <-"><:P10,0,><+"><-">
  2284. <:I0,432,0,0><:S+273><:R1,15,1,432,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2285. @PartNumber@<:s><:S+417><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#417,6624><:f480,BMezzMM_725 BL,><+!>Part II<-!><:f>
  2286. @Title@<:s><:S+417><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#417,6624><:f720,BMezzMM_585 BD,>The New Book of the Parser<:f>
  2287. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2288. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2289. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><+"> Chapter Four of the <-">TADS Author's Manual<+"></`>describes the player command parser as it was in version 2.0.  Since then, we've added substantial new functionality to the parser.  For the past few releases, we described the new features as they we
  2290. re added, but until now there was no single source of information on the parser<-"><+">; as a result, it was often difficult to see how the new features and the original features worked together. 
  2291. <-"><+"> This section covers <-">all<+"> of the parser's features--new and old--and is intended to replace Chapter Four of the 
  2292. <-">Author's Manual.
  2293. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2294. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>If you were going to write a text adventure game, and you didn't have a system such as TADS, you would be faced with the daunting prospect of designing a player command parser. The job is so large that you'd probably spend more time designing and implementi
  2295. ng your parser than on any other part of the game.
  2296. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>Fortunately, if you're taking the time to read this, you're at least thinking about building your game with 
  2297. <:f,2MinioMMSC_367 RG 585 NO 11 OP,>TADS<:f>, which means that you won't have to write your own parser. Using an existing parser will save you a vast amount of work, but won't eliminate your work entirely:  you won't have to write your own parser, but you w
  2298. ill have to learn enough about the parser you're using to write your game.
  2299. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#3822,6624>With TADS, the amount you need to learn depends on what you want to do. You can do quite a lot with TADS without learning anything at all about the parser--by using existing class libraries (such as the standard library adv.t supplied with TADS), you can cr
  2300. eate objects whose interactions with the parser have already been defined, so that all you need to do is fill in some simple information on the objects, such as their names and descriptions. Once you've become comfortable with the basics of writing TADS gam
  2301. es, though, you'll want to create your own object classes, with their own interactions with existing verbs; to do this, you'll have to learn a little bit about how the parser processes commands, so that you can add code to your new objects that lets them re
  2302. spond to certain commands. You'll probably also want to be able to create your own verbs, which requires that you learn how to define your own commands. After you've done all of this, you may want to start making more complicated changes, which will require
  2303.  that you learn about some of the more esoteric aspects of the parser.
  2304. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2305. @Subhead@<:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#572,6624>Parsing Fundamentals
  2306. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2307. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,>The first part of this chapter is an overview of what you need to know about parsing to get started with TADS:  how to create objects and give them names the player can use in commands; how to make customize the way your objects respond to commands; and how
  2308.  to create your own new commands. One of the nice features of TADS is that you can write games almost immediately, and fill in your knowledge with more detail as you go. This section is intended to help you get started--we begin with the minimum information
  2309.  you need, and then move on to the more advanced features.
  2310. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2311. @Header@<:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#370,6624>Using Pre-Defined Objects
  2312. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2313. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>The very least you have to learn about the parser to write a game is:  nothing!  That's because you can write a game using only objects that have been defined already--for example, you can use the objects defined in adv.t, the library of common adventure ob
  2314. jects included with TADS. To create a box, which can be opened and closed (but starts off open), you would only have to write this code:
  2315. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2316. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>box:  openable
  2317. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    sdesc = "box"
  2318. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    noun = '<:f><:f200,QCourier New,>box'<:f>
  2319. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    location = startroom
  2320. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    isopen = true
  2321. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>;<:f>
  2322. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2323. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>The class <:f200,QCourier New,>openable<:f> (defined in adv.t) has already been set up to respond to the commands appropriate for a container that can be opened and closed--it automatically knows how to respond to all of these commands from a player:
  2324. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2325. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><;>open the box
  2326. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><;>look in the box
  2327. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><;>put everything in the box
  2328. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><;>the the ball out of the box
  2329. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><;>put the book in the box, and close the box
  2330. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2331. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>Although we said you didn't have to know anything about parsing to use objects defined in adv.t, you actually have to know a little bit about parsing:  you have to know how to give an object a name.
  2332. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2457,6624>In the object above, we defined a property called <:f200,QCourier New,>noun<:f>, which we set to 
  2333. <:f200,QCourier New,>'<:f><:f200,QCourier New,>box'<:f>. The <:f200,QCourier New,>noun<:f> property is special--it's a 
  2334. <+">vocabulary<-"> property. Vocabulary properties assign names to an object that the player can use in commands; the vocabulary properties are 
  2335. <:f200,QCourier New,>noun<:f>, <:f200,QCourier New,>adjective<:f>, 
  2336. <:f200,QCourier New,>verb<:f>, <:f200,QCourier New,>preposition<:f>, 
  2337. <:f200,QCourier New,>article<:f>, and <:f200,QCourier New,>verb<:f>. For the most part, you will define 
  2338. <:f200,QCourier New,>noun<:f> and <:f200,QCourier New,>adjective<:f> vocabulary properties; you won't need to use the others until you start defining new commands of your own. Note a very important feature about vocabulary properties:  the value of a vocabu
  2339. lary property must always be a single-quoted string.
  2340. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2341. <:s><:I0,360,1530,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f,BGillSans,> Theorem 1. <:f><+">A vocabulary string must be in single quotes.<-">
  2342. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2343. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>Vocabulary properties are different from normal properties.  Their only function is to define words that the player can use to refer to the object.  Unlike ordinary properties, vocabulary properties can't be used from within your game program.  For example,
  2344.  this line of code won't display anything at all:
  2345. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2346. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>say(box.noun);<:f>
  2347. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2348. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>The property <:f200,QCourier New,>box.noun<:f> simply has no value at run-time.  You can't use the vocabulary properties to get the vocabulary words for an object at run-time; however, you 
  2349. <+">can<-"> get these properties using the built-in function <:f200,QCourier New,>getwords()<:f>.
  2350. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>When you assign a vocabulary property to an object, you create a word that the player can use in a command, and you assign the word a particular "part of speech."  A word's part of speech determines how the word can be used in a sentence, the same way it do
  2351. es in ordinary speech. When you define a word in a <:f200,QCourier New,>noun<:f> property, you're specifying that the word can be used in a player's commands wherever a noun is grammatically valid. You're also specifying that the word refers to this particu
  2352. lar object.
  2353. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>The same word can be assigned to multiple objects. For example, you may have several objects in your game that all have the noun "box."  In addition, the same word can be used as multiple parts of speech. For example, you might have one object in your game 
  2354. called a "paper towel," and another called a "term paper"; the word "paper" in this case can be used as either a noun and an adjective.
  2355. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>You can also define more than one of the same part of speech for an object. In many cases, you will want to provide several synonyms for an object's words. You can do this easily--simply list all of the synonyms in the vocabulary property for each part of s
  2356. peech. For example, if you have a booklet in your game, you may want to provide a number of similar words that the player can use to refer to the object:
  2357. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2358. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>booklet: item
  2359. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    location = startroom
  2360. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    sdesc = "booklet"
  2361. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    ldesc = "It'<:f><:f200,QCourier New,>s a small booklet labeled<:f>
  2362. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        \"TADS Release Notes\". "
  2363. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    noun = '<:f><:f200,QCourier New,>book'<:f><:f200,QCourier New,> '<:f><:f200,QCourier New,>booklet'<:f><:f200,QCourier New,> '<:f><:f200,QCourier New,>notes'<:f>
  2364. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    adjective = '<:f><:f200,QCourier New,>tads'<:f><:f200,QCourier New,> '<:f><:f200,QCourier New,>release'<:f><:f200,QCourier New,> '<:f><:f200,QCourier New,>small'<:f>
  2365. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>;<:f>
  2366. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2367. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>Notice that each word in each list is enclosed in single quotes. With this definition, you could refer to the booklet as "release notes," or "small tads booklet," or any other combination of these adjectives and nouns.
  2368. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2369. @Header@<:s><:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#370,6624>Responding to Commands
  2370. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2371. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>Adv.t defines many types of objects that are common in adventure games, and you will probably be able to write a substantial part of your game using only these objects. However, a game that only involved objects from adv.t would be very dull, so you'll soon
  2372.  want to be able to create objects of your own that respond in novel ways to certain commands. To do this, you'll need to understand how verbs are applied to objects.
  2373. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#4368,6624>Each command that the parser understands has a set of methods that it calls in the objects making up the command (a method is simply a function or subroutine that's associated with a particular object). When the player types a command that involves a verb a
  2374. nd a noun, the parser figures out which methods to call based on the verb, and then calls these methods in the object specified by the noun. For example, the verb "open" has two methods that it calls in the object being opened:  it has a 
  2375. <+">verification<-"> method named <:f200,QCourier New,>verDoOpen<:f>, and an 
  2376. <+">action<-"></`>method called <:f200,QCourier New,>doOpen<:f>. (The "do" in these names stands for "direct object"--it's not meant to be the verb "do.")  The verification method is used to determine if the object is logical with the verb--for "open," an o
  2377. bject is logical if it can be opened and closed in the first place, and if it's not already open. The verification method doesn't have to test to see whether the object is accessible to the player, because this testing is done separately; this method only h
  2378. as to check to determine if the object makes sense with the verb. The action method carries out the verb; it doesn't have to check to see whether the object makes sense with the command, since the verification method has already done this.
  2379. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>Suppose you wanted to make an object that does something unusual when opened. For example, you might want to have a can that contains a spring-loaded snake that jumps out when the can is opened. To do this, you'd customize the can's handling of the "open" c
  2380. ommand.
  2381. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>If we make the can an <:f200,QCourier New,>openable<:f>, as we did with the box, we'd get the automatic handling of opening and closing the can. However, we want some additional behavior--when the object is opened, and it contains the snake, we want the sna
  2382. ke to jump out. To do this, we'll <+">override<-"> the <:f200,QCourier New,>verDoOpen<:f> method that's defined by the 
  2383. <:f200,QCourier New,>openable<:f>:
  2384. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2385. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>snakeCan:  openable
  2386. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    sdesc = "can"
  2387. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    noun = '<:f><:f200,QCourier New,>can'<:f>
  2388. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    doOpen(actor) =
  2389. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    {
  2390. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        inherited.doOpen(actor);
  2391. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        if (snake.isIn(self))
  2392. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        {
  2393. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>            " As you open the can, a spring-loaded
  2394. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>            fake<:f><:f200,QCourier New,> snake leaps out!  You'<:f><:f200,QCourier New,>re so
  2395. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>            surprised that you <:f><:f200,QCourier New,>drop the can.";
  2396. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>            self.moveInto(actor.location);
  2397. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>            snake.moveInto(actor.location);
  2398. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        }
  2399. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    }
  2400. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>;<:f>
  2401. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2402. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>The first thing the new action routine does is to <+">inherit<-"> the default 
  2403. <:f200,QCourier New,>doOpen<:f> that was defined by <:f200,QCourier New,>openable<:f> in adv.t. When overriding a method, it's often useful to be able to incorporate the original method from the class--the 
  2404. <:f200,QCourier New,>inherited<:f> keyword lets you do this. The inherited default 
  2405. <:f200,QCourier New,>doOpen<:f> opens the can as usual. After that's been done, we check to see if the snake is in the can; if so, we take our special action:  display a message telling the player about the snake, then moving both the can and the snake to t
  2406. he player's location.
  2407. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#3276,6624>There are a couple more things to notice in this example. One is the parameter 
  2408. <:f200,QCourier New,>actor<:f>. Whenever a verification or action routine is called, the system includes the actor to whom the command was directed as an argument. When the player types a command without specifying an actor, the player's actor 
  2409. <:f200,QCourier New,>Me<:f> is used by default--<:f200,QCourier New,>Me<:f> is a special object that refers to the player. You can always find out what room the player is in with 
  2410. <:f200,QCourier New,>Me.location<:f>, and you can find out what the player is carrying with 
  2411. <:f200,QCourier New,>Me.contents<:f>. However, by writing our <:f200,QCourier New,>doOpen<:f> method in terms of the actor object passed as a parameter, we can make it possible for the player to direct commands to other characters in the game, and have the 
  2412. commands work properly. So, rather than moving the snake and the can to 
  2413. <:f200,QCourier New,>Me.location<:f>, we moved them to <:f200,QCourier New,>actor.location<:f> (which will be the same thing if the player was opening the can him or herself).
  2414. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>If you wanted to make the command even more adaptable to another character, you should replace some of the text in the message with special "format strings":
  2415. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2416. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>" As %you% open the can, a spring-loaded
  2417. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>fake<:f><:f200,QCourier New,> snake leaps out!  %You'<:f><:f200,QCourier New,>re% so
  2418. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>surprised that %you% <:f><:f200,QCourier New,>drop%s% the can.";<:f>
  2419. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>
  2420. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2730,6624>The special sequences in percent signs, such as "<:f200,QCourier New,>%you%<:f>", are converted by the system automatically to an appropriate word based on the current actor. If the command is being carried out by the player actor, the message displayed is 
  2421. the same as the original; however, if the command is directed to another character in the game, the terms are all replaced by something appropriate to that character. In most games, the non-player characters can only carry out certain selected commands, so 
  2422. you only need to worry about this when you're writing a command that can be directed to a character. All of the command handlers in adv.t are written this way, but you only need to worry about the ones you know can be carried out by a non-player character.
  2423. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>Note that we only had to change the action (<:f200,QCourier New,>doOpen<:f>) routine--we didn't do anything to the verification (<:f200,QCourier New,>verDoOpen<:f>) routine, because the one we inherited from 
  2424. <:f200,QCourier New,>container<:f> already does what we need.
  2425. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>Now suppose we wanted to handle another verb; but this time, it's one that the object doesn't inherit from its class. Let's suppose that we want to make it possible to read the can's label, but only after the can has been cleaned. For this, we'll need to ne
  2426. w verbs, "read" and "clean," both of which are defined in adv.t. As with "open," these verbs each have a verification and an action method. We'll add the following code to the can:
  2427. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2428. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>isClean = nil
  2429. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>verDoClean(actor) =
  2430. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>{
  2431. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    if (self.isClean)
  2432. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        "You can'<:f><:f200,QCourier New,>t make it much cleaner.";
  2433. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>}
  2434. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>doClean(actor) =
  2435. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>{
  2436. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    "You wipe off the label. It'<:f><:f200,QCourier New,>s much more
  2437. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    readable now.";
  2438. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    self.isClean := true;
  2439. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>}
  2440. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>verDoRead(actor) =
  2441. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>{
  2442. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    if (not self.isClean)
  2443. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        "It's far too dirty.";
  2444. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>}
  2445. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>doRead(actor) =
  2446. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>{
  2447. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    "It's labeled<:f><:f200,QCourier New,> \"Snake in a Can.\"";
  2448. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>}<:f>
  2449. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>
  2450. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>The verification routine is a little strange, because it doesn't seem to do anything--all it does is check to see whether the command makes sense, and displays a message if not. This is, in fact, all that a verification routine should 
  2451. <+">ever<-"></`>do. The most important thing to remember about verification routines is that they must 
  2452. <+">never<-"> modify the game's state in any way--for example, they must never set a property's value. Only the action routine should change game state.
  2453. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2454. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f,BGillSans,>Theorem 2<:f><:f,BGillSans,>. <:f><+">Never modify any game state in a verification routine.<-">
  2455. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2456. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#4641,6624>The reason that verification methods shouldn't change any game state is that these methods are sometimes called "silently" by the parser; that is, the parser turns off the output, and calls a verification method. The player will never know that the method h
  2457. as been called at all, because any text it displayed was suppressed--this is what we mean when we say that the method is called "silently."  The parser makes these invisible calls to verification methods when it's trying to figure out which of several possi
  2458. ble objects the player means. For example, suppose the player is in a room with two doors, one red and one blue, and the red door is open and the blue door is closed; if the player types "open door," the parser calls the verification routine on each door to
  2459.  determine which one makes the most sense. The red door's verification method will display a message saying that you can't open it because it's already open; the blue door's method will say nothing. These calls are made with the text output turned off, beca
  2460. use the parser isn't really trying to open anything at this point--it's merely trying to figure out which door makes more sense with the command. Once it's decided which one to open, the parser will run the verification method with output turned on, and the
  2461. n it will run the action method.
  2462. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2184,6624>How does a verification method tell the parser that the command is not logical?  Simple:  it displays a message. So, the verification routine's only function is to display an error. If the verb is logical for the object, the verification method doesn't do a
  2463. nything at all--since the verb makes sense, there's no error to display. If the verb does 
  2464. <+">not<-"></`>make sense, the verification method displays an error message telling the player why the verb can't be used. The parser sees the message, and knows that it indicates that the verb can't be used, so it won't try to run the action routine.
  2465. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>There's another important feature of the verification method:  if an object doesn't have a verification method defined at all--which means that the object neither defines the verification method itself nor inherits the method from a superclass--the command 
  2466. automatically fails, and the parser generates the message "I don't know how to 
  2467. <+">verb<-"> the <+">object<-">."  So, if you want an object to be able to carry out a command, you 
  2468. <+">must<-"></`>either define the verification method directly in the object, or make sure the object inherits the verification method from a class.
  2469. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2470. @Header@<:R><:#370,6624>Creating New Commands
  2471. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2472. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>Once you start writing your game, you'll quickly want to start adding your own new commands. One of the features that makes TADS so powerful is that it has 
  2473. <+">no<-"></`>built-in verbs--all of the verbs you've seen so far are defined in adv.t, not within TADS itself, so you can change, replace, or remove any of them, and, of course, add new verbs of your own.
  2474. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>We've already mentioned that there's a vocabulary property called 
  2475. <:f200,QCourier New,>verb<:f>; as you might guess, this is the vocabulary property that you use to add a new command. You may wonder what sort of object you attach the 
  2476. <:f200,QCourier New,>verb<:f> property to. The answer is that there's a special kind of object defined in adv.t, called 
  2477. <:f200,QCourier New,>deepverb<:f>, that you can use as a command object. This isn't an object that the player sees as part of your game--it's merely an abstract, internal object, whose purpose is to contain the data and methods that define a new command.
  2478. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>TADS allows you to create three basic types of commands:  a command that consists simply of a verb, such as "look" or "jump"; a command that has a verb and a direct object, such as "take book" or "turn on the flashlight"; and a command that has a verb, a di
  2479. rect object, a preposition, and an indirect object, such as "put the ball in the box" or "clean the lens with the tissue."  The same word can be used in more than one form of command; for example, you might define commands such as "lock door" and "lock door
  2480.  with key."
  2481. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>For the first type of sentence, which has only a verb, you define the entire command in the 
  2482. <:f200,QCourier New,>deepverb<:f> object. You specify the action that the verb carries out with a method called 
  2483. <:f200,QCourier New,>action<:f> that you define in the <:f200,QCourier New,>deepverb<:f> object. For example, to define a verb called "scream" that displays a message, you could do this:
  2484. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2485. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>screamVerb: deepverb
  2486. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    verb = 'scream'
  2487. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    sdesc = "scream"
  2488. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    action(actor) =
  2489. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    {
  2490. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        "Aaaaaiiiiieeeee!!!\n";
  2491. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        "(You feel much better now.)";
  2492. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    }
  2493. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>;<:f>
  2494. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2495. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>The presence of the <:f200,QCourier New,>action<:f> method in the object that defines the verb allows the command to be used without any objects. If you define a 
  2496. <:f200,QCourier New,>deepverb<:f> that doesn't have an <:f200,QCourier New,>action<:f> method, and the player types the verb without any objects, the parser asks the player to supply a direct object, because the parser can't execute the command without any 
  2497. objects when no <:f200,QCourier New,>action<:f> method is present.
  2498. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2457,6624>For the second type of sentence, which has a verb and a direct object, you must set up a 
  2499. <:f200,QCourier New,>deepverb<:f> object--but, as you have already seen, the command is carried out by the direct object, not by the verb itself. The 
  2500. <:f200,QCourier New,>deepverb<:f> object serves to tell the parser about the verb and how it works--it contains the 
  2501. <:f200,QCourier New,>verb<:f> property, and also has the <:f200,QCourier New,>doAction<:f> property. The 
  2502. <:f200,QCourier New,>doAction<:f> property is a special property that tells the system that the command can be used with a direct object (the "<:f200,QCourier New,>do<:f>" in 
  2503. <:f200,QCourier New,>doAction<:f> stands for "direct object," just as it did with methods such as 
  2504. <:f200,QCourier New,>doOpen<:f>), and tells the system what the verification and action methods are called.
  2505. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2184,6624>Here's how it works:  you define the property <:f200,QCourier New,>doAction<:f> in the 
  2506. <:f200,QCourier New,>deepverb<:f> as a single-quoted string. The parser takes the string '<:f200,QCourier New,>verDo<:f>' and puts it in front of your string--this becomes the name of the verification property. The parser then takes '<:f200,QCourier New,>do
  2507. <:f>' and puts it in front of your string--this becomes the name of the action property. For example, if you define a verb to scream at someone, and you specify 
  2508. <:f200,QCourier New,>doAction = 'Screamat'<:f>, then the verification method for your new command is 
  2509. <:f200,QCourier New,>verDoScreamat<:f>, and the action method is <:f200,QCourier New,>doScreamat<:f>. Here's how your 
  2510. <:f200,QCourier New,>deepverb<:f> definition would look:
  2511. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2512. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>screamatVerb: deepverb
  2513. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    sdesc = "scream at"
  2514. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    verb = 'scream at'
  2515. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    doAction = 'Screamat'
  2516. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>;<:f>
  2517. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2518. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>If the player types "scream at the phone," the parser first calls the 
  2519. <:f200,QCourier New,>verDoScreamat<:f> method in the phone object, to verify that the command is sensible; if the verification method is defined, and succeeds (which means that it doesn't display any messages), the parser proceeds to call the 
  2520. <:f200,QCourier New,>doScreamat<:f> method, which should carry out the action of the command.
  2521. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>There are two more things to notice in this example.
  2522. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#3549,6624>The first is that the <:f200,QCourier New,>verb<:f> property we defined has two words. This is a special ability of the 
  2523. <:f200,QCourier New,>verb<:f> property--you can't do anything similar for 
  2524. <:f200,QCourier New,>noun<:f>, <:f200,QCourier New,>adjective<:f>, or any of the other vocabulary properties. If you define a two-word verb, you must separate the two words by a space, and you must define the second word as a preposition. (In this case, "at
  2525. " is already defined as a preposition in adv.t, as are most English prepositions. If you add a two-word verb, be sure that the second word is defined as a preposition; if it's not so defined in adv.t, you must define it in your game's source code.)  Two-wor
  2526. d verbs are useful, because many English verbs take this form. When a verb has a direct object, TADS lets the player use the second word immediately after the verb, or at the end of the sentence. With "scream at," the latter doesn't make much sense, but for
  2527.  many verbs it does--for example, you might say "pick up the book," but it would be equally valid to say "pick the book up."  TADS understands both.
  2528. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2730,6624>The second thing to notice is the use of capitalization in the <:f200,QCourier New,>doAction<:f> string. The convention used by adv.t is to capitalize the first letter of a preposition, but 
  2529. <+">only for verbs that take an indirect object. <-">For example, adv.t defines an 
  2530. <:f200,QCourier New,>ioAction<:f> of <:f200,QCourier New,>GiveTo<:f> for the command "give 
  2531. <+">object<-"></`>to <+">actor<-">"; the To is capitalized because "to" is the preposition that introduces an indirect object. For our verb here, we don't have an indirect object--the preposition is part of the verb, rather than a word that introduces an in
  2532. direct object--so we do <+">not<-"> capitalize the "at" in <:f200,QCourier New,>Screamat<:f>. You don't have to use this convention, since the string that you define in a 
  2533. <:f200,QCourier New,>doAction<:f> is entirely up to you, but it may help you to make sense of adv.t if you know the convention it uses.
  2534. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>The third type of sentence has both a direct object and an indirect object, and has a preposition that introduces the indirect object. For example, you might want to create a command such as "burn paper with torch."  To define this command, you use the 
  2535. <:f200,QCourier New,>ioAction<:f> property of the deepverb. This property is similar to 
  2536. <:f200,QCourier New,>doAction<:f>, but it defines <+">three<-"></`>new methods, and also associates a preposition with the command:
  2537. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2538. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>burnVerb: deepverb
  2539. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    sdesc = "burn"
  2540. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    verb = 'burn'
  2541. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    ioAction(withPrep) = 'BurnWith'
  2542. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>;<:f>
  2543. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2544. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>Notice that <:f200,QCourier New,>'BurnWith'<:f> follows the capitalization convention described earlier. Since the preposition introduces an indirect object, and isn't merely a part of the verb, we capitalized its first letter.
  2545. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>The association of the preposition is done with the <:f200,QCourier New,>withPrep<:f> in the parentheses--<:f200,QCourier New,>withPrep<:f> is an object, defined in adv.t, which specifies a 
  2546. <:f200,QCourier New,>preposition<:f> property that defines the vocabulary word "with."  The 
  2547. <:f200,QCourier New,>withPrep<:f> object is of class <:f200,QCourier New,>Prep<:f>, which is similar to 
  2548. <:f200,QCourier New,>deepverb<:f>:   it's an abstract type of object that isn't visible to a player, and its only function is to define the vocabulary word and associate it with an object that can be referenced from within your game program.
  2549. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>This definition tells the parser that sentences that start with the verb "burn" must have a direct object, and an indirect object, and that the objects are separated with the preposition "with."  When a sentence matching this pattern is entered by the playe
  2550. r, the parser will use this verb definition to execute the command.
  2551. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#3276,6624>We mentioned that an <:f200,QCourier New,>ioAction<:f> defines three methods. Recall that 
  2552. <:f200,QCourier New,>doAction<:f> defines two methods from its root string:  a verification method (starting with 
  2553. <:f200,QCourier New,>verDo<:f>), and an action method (starting with 
  2554. <:f200,QCourier New,>do<:f>). The <:f200,QCourier New,>ioAction<:f> property similarly defines verification and action methods, but since two objects are involved, it must generate not one but two verification methods:  one for the direct object, and anothe
  2555. r for the indirect object. The methods are called <:f200,QCourier New,>verIoBurnWith<:f> and 
  2556. <:f200,QCourier New,>verDoBurnWith<:f>. As you might guess from the names, 
  2557. <:f200,QCourier New,>verIoBurnWith<:f> is sent to the indirect object, and 
  2558. <:f200,QCourier New,>verDoBurnWith<:f> goes to the direct object--and they're called in that order, with the indirect object going first. If 
  2559. <+">both<-"></`>verification methods are defined and successful, then the parser calls the action method, 
  2560. <:f200,QCourier New,>ioBurnWith<:f>--this is called only for the indirect object. The parser never calls an action method in the direct object for a two-object command.
  2561. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>The verification and action methods for verbs with two objects are a little different than those for single-object verbs. Whereas a single object verb's verification and action methods only take the actor as a parameter, two of the two-verb methods get an a
  2562. dditional parameter:  the other object. The remaining method only gets the actor. The definitions should look like this:
  2563. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2564. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>verIoBurnWith(actor) = { ... }
  2565. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>verDoBurnWith(actor, iobj) = { ...}
  2566. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>ioBurnWith(actor, dobj) = { ... }<:f>
  2567. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2568. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>This may seem strange, but there's a reason. Since the parser calls 
  2569. <:f200,QCourier New,>verIoBurnWith<:f> first, it doesn't always know what the direct object is when it calls 
  2570. <:f200,QCourier New,>verIoBurnWith<:f>. As a result, it can't provide it as a parameter. By the time it calls 
  2571. <:f200,QCourier New,>verDoBurnWith<:f>, though, the indirect object is known, so the extra parameter is provided. 
  2572. <:f200,QCourier New,>ioBurnWith<:f> is called later still, so the extra object is also provided as a parameter there.
  2573. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2574. <:I0,360,1440,0><:R1,13,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f,BGillSans,>Theorem 3.<:f>     <+">verIoXxxx does <+!>not<-!></`>have a dobj parameter.<-">
  2575. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2576. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2730,6624>You may notice that there are some methods defined in adv.t that might make you think that the parser also calls 
  2577. <:f200,QCourier New,>doBurnWith<:f>. In fact, the parser will never call 
  2578. <:f200,QCourier New,>doBurnWith<:f> itself, but this is a perfectly valid method name which you can call from your own code. Sometimes, you will want the action of a two-object verb to be carried out by the indirect object, and other times you'll want to us
  2579. e the direct object. Which way is better depends entirely on the situation--in general, the better way is the one that requires you to write less code. If you find a situation where you want to handle a two-object command's action in the direct object rathe
  2580. r than in the indirect object, simply write an indirect object action routine that looks like this:
  2581. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2582. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>ioBurnWith(actor, dobj) =
  2583. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>{
  2584. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    dobj.doBurnWith(actor, self);
  2585. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>}<:f>
  2586. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2587. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>The parser will never call <:f200,QCourier New,>doBurnWith<:f>, but there's nothing to stop you from calling it.
  2588. <:s><:I0,360,1440,0><:R1,13,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f,BGillSans,>
  2589. <:I0,360,1440,0><:R1,13,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f,BGillSans,>Theorem 4.<:f>     <+">The parser never calls d<-"><+">oXxxx for a two-object verb.<-">
  2590. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2591. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>If you find yourself in a situation where the standard order of verification for a two-object verb is wrong, TADS does let you change this default ordering. We're moving into advanced territory here, so you probably won't need to know this for quite a while
  2592. , but you might at least want to note that it's possible. When you define an 
  2593. <:f200,QCourier New,>ioAction<:f>, you can include a special modifier that tells TADS to change the ordering:
  2594. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2595. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>ioAction = <[>disambigDobjFirst] 'BurnWith'<:f>
  2596. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2597. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>The modifier is the strange-looking word in square brackets; it tells TADS that you want to reverse the normal ordering. When you include this modifier, the parser will process the verification and action methods in a different order than usual:
  2598. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2599. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>verDoBurnWith(actor) = { ...}<:f>
  2600. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>verIoBurnWith(actor, dobj) = { ... }
  2601. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>ioBurnWith(actor, dobj) = { ... }<:f>
  2602. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>
  2603. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>Note that the parameters changed along with the order. Since the direct object is processed first for this command, the direct object verification routine is called before the indirect object is known, and hence no indirect object is passed to it; and since
  2604.  the indirect object verification routine is called after the direct object is already known, the direct object is supplied as a parameter to this routine.
  2605. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2606. @Header@<:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#370,6624>Adding to an Existing Verb
  2607. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2608. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>As you add your own new commands, you will probably find that you want to augment the definition of one of the verbs defined in adv.t. For example, you may want to add a new command such as "open crate with crowbar."  Since a verb for "open" is already defi
  2609. ned in adv.t, you can't create another "open" verb in your own game. Fortunately, TADS lets you supplement an existing verb without having to change the original definition's source code.
  2610. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>To change an existing verb, you can use the TADS <:f200,QCourier New,>modify<:f>  statement. This statement lets you add properties to an object that has already been defined elsewhere in your game (even in a separate file that you include, such as adv.t). 
  2611. For example, to modify the "open" verb defined in adv.t to add an "open with" command, you would do this:
  2612. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2613. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>modify openVerb
  2614. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    ioAction(withPrep) = 'OpenWith'
  2615. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>;<:f>
  2616. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2617. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>We strongly recommend that you use the <:f200,QCourier New,>modify<:f> mechanism whenever possible, rather than making source changes to adv.t. If you edit adv.t directly, you may find that you have a lot of work to do when you upgrade to a new version of T
  2618. ADS, because we will probably modify adv.t--if you also modify it, you will have to figure out how to apply your changes to the new version of adv.t  If you use the 
  2619. <:f200,QCourier New,>modify<:f> mechanism instead, you should be able to use future versions of adv.t without any additional work.
  2620. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2621. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f,BGillSans,>Theorem 5<:f><:f,BGillSans,>. <:f><+">Don't edit adv.t directly--use 
  2622. <+!>modify<-!> instead.<-">
  2623. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2624. @Header@<:s><:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#370,6624>Overview of Disambiguation
  2625. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2626. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2457,6624>As you build your game, you will probably add multiple objects that all go by the same name. When you give the same noun to two or more objects, you create the possibility that a player can type in a command with an ambiguous object name--that is, the words
  2627.  that the player uses refer to more than one object. For example, if you create several books in your game, you will probably give them all the noun "book"; a command such as "take book" could refer to any of these objects. Fortunately, the TADS parser has 
  2628. a powerful system that can resolve ambiguous object names; in many cases, the parser can disambiguate objects automatically, without needing any help from the player.
  2629. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>The first step in disambiguating an object name is to apply the visibility and access rules. These rules, which are defined by objects in your game program, determine whether an object is visible to the player, and if so whether it can be used with a partic
  2630. ular verb. If an object is neither visible, nor accessible for use by the player with the given verb, the object isn't considered further. If it's visible but not accessible, it will be considered only to the extent that there isn't another object which 
  2631. <+">is<-"> accessible.
  2632. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>Visibility is determined by the method <:f200,QCourier New,>isVisible<:f>, which is defined for each game object. The general-purpose class 
  2633. <:f200,QCourier New,>thing<:f> defined in adv.t provides a definition of this method suitable for most objects; you will probably not need to make any changes to this method unless you need some special effect. To determine if an object is visible to the pl
  2634. ayer, the parser makes this call:
  2635. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2636. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+">object<:f200,QCourier New,><-">.isVisible(Me)<:f>
  2637. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2638. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>Accessibility is determined by the <:f200,QCourier New,>deepverb<:f> object. For a direct object, the parser first calls the method 
  2639. <:f200,QCourier New,>validDoList<:f>, which returns a list of all objects which are 
  2640. <+">possibly<-"> valid for the verb; the objects in the list aren't necessarily valid, but any objects 
  2641. <+">not<-"></`>in the list are <+">not<-"></`>valid. If <:f200,QCourier New,>validDoList<:f> returns 
  2642. <:f200,QCourier New,>nil<:f>, it means that <+">all<-"> objects are possibly valid and should be considered. A similar method, 
  2643. <:f200,QCourier New,>validIoList<:f>,  returns a list of possibly-valid indirect objects.
  2644. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>After eliminating any objects that aren't in the <:f200,QCourier New,>validDoList<:f> (or 
  2645. <:f200,QCourier New,>validIoList<:f>, as appropriate), the parser submits each surviving object to the method 
  2646. <:f200,QCourier New,>validDo<:f>, also defined in the <:f200,QCourier New,>deepverb<:f> object. This method takes the object as a parameter, and returns 
  2647. <:f200,QCourier New,>true<:f> if the object is valid for the verb, 
  2648. <:f200,QCourier New,>nil<:f> if not. The parser keeps only objects that are valid.
  2649. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>If any objects remain, the parser turns off output and calls the appropriate validation method in each object. This is the "silent" validation call that we mentioned earlier. If only one of the objects passes the validation test (that is, the validation met
  2650. hod doesn't attempt to display any messages), that object is chosen. Otherwise, the parser gives up and asks the player which of the objects to use.
  2651. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>The silent validation test lets TADS be very intelligent about disambiguation. For example, if there's an open door and a closed door in the room, and the player types "open door," the validation test lets the system determine that the player means to open 
  2652. the closed door--since the <:f200,QCourier New,>verDoOpen<:f> method fails for the open door (it displays "It's already open" if the default verification method from adv.t is used), but succeeds for the closed door, the parser knows to choose the closed doo
  2653. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>The second half of this chapter, "The Parser in Detail," has full details on how disambiguation works.
  2654. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2655. @Header@<:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#370,6624><:ZDefaultObjects><:Z~DefaultObjects>Default objects and "All"
  2656. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2657. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>The parser also tries to be intelligent about supplying defaults when the player provides only partial information. The parser supplies default direct and indirect objects for commands that omit one of these objects, using rules defined by the objects in yo
  2658. ur game program.
  2659. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2730,6624>To determine a verb's default direct object, the parser calls the method 
  2660. <:f200,QCourier New,>doDefault<:f> in the <:f200,QCourier New,>deepverb<:f> object. This method returns a list of default direct objects. The verbs in adv.t generally return a list of all accessible objects; a couple of verbs return more restricted lists (f
  2661. or example, "take" returns a list of accessible objects that aren't already in the player's inventory). Similarly, the parser calls the 
  2662. <:f200,QCourier New,>deepverb<:f> method <:f200,QCourier New,>ioDefault<:f> to get a list of default indirect objects. When 
  2663. <:f200,QCourier New,>doDefault<:f> (or <:f200,QCourier New,>ioDefault<:f>, as appropriate) returns a list that consists of exactly one object, the parser uses this object as the default for the command. If the list is empty, or consists of more than one obj
  2664. ect, the parser will ask the player to supply the object, because the command doesn't imply a particular object.
  2665. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>The parser's automatic default system can be especially convenient for indirect objects. Certain commands imply the use of particular indirect objects; for example, "dig" implies a shovel or similar tool. For such commands, it's a good idea to define 
  2666. <:f200,QCourier New,>ioDefault<:f> methods that return a list of accessible objects that satisfy particular criteria; for "dig," you would return a list of accessible objects that are usable for digging.
  2667. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2730,6624>The <:f200,QCourier New,>doDefault<:f> method has another use:  the parser calls these methods to determine the meaning of "all."  When the player uses "all" as a direct object, the parser replaces "all" by the list returned by 
  2668. <:f200,QCourier New,>doDefault<:f>. Since the parser doesn't allow using a command to include multiple indirect objects, "all" cannot be used as the indirect object, hence 
  2669. <:f200,QCourier New,>ioDefault<:f> will never be used to supply a list for "all."  Note that you can disallow using "all" (and multiple direct objects in general) for a particular verb by defining the property 
  2670. <:f200,QCourier New,>rejectMultiDobj<:f> to be <:f200,QCourier New,>true<:f> in the 
  2671. <:f200,QCourier New,>deepverb<:f>.  Here's an example of using <:f200,QCourier New,>rejectMultiDobj<:f> to prevent the player from being able to look at everything in the room all at once:
  2672. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2673. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>modify inspectVerb
  2674. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    rejectMultiDobj(prep) =
  2675. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    {
  2676. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        "You can only look at one thing at a time.";
  2677. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        return true;
  2678. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    }
  2679. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>;<:f>
  2680. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2681. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2682. @Subhead@<:s><:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#572,6624>The Parser in Detail
  2683. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2684. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>The rest of this chapter is devoted to the details of how the parser works. The sections are organized in roughly the same order as the steps the parser executes as it analyzes and executes a player's command.
  2685. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#3003,6624>When the player types a line of text into your game, the TADS parser goes through a series of operations to convert the command line into simple actions on objects in the game. In the course of these operations, the parser makes calls to your game program f
  2686. or advice; in most cases, the parser has default actions for these calls, so you don't need to include any code in your game program for the default behavior. You can, however, customize the parser by providing definitions for these "hooks" in your game. Th
  2687. e main purpose of this chapter is to describe the way the parser interacts with your game program, so that you can customize the parser by overriding the defaults. We also describe many of the internal operations of the parser so that you can understand how
  2688.  to make it behave the way you want it to.
  2689. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2690. @Header@<:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#370,6624><:ZReadingACommand><:Z~ReadingACommand>Reading a Command Line
  2691. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2692. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>The first step in parsing is getting a command line from the player. The parser does this automatically, without any action by your game program, at the beginning of each turn. The parser displays its prompt, then waits for the user to enter a line of text.
  2693. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2184,6624>The prompt is the first parser default action that you can override:  if your game defines a function called 
  2694. <:f200,QCourier New,>commandPrompt<:f>, the parser will call this function when it needs to display a prompt; otherwise, it will display its default prompt, which is a greater-than sign (<:f200,QCourier New,><;><:f>). The 
  2695. <:f200,QCourier New,>commandPrompt<:f> function is called with an argument that lets you display distinct prompts for different situations, if you wish; the default prompt is always the same, regardless of the type of input being requested, but you can use 
  2696. different prompts for the different types of input if you prefer. The 
  2697. <:f200,QCourier New,>commandPrompt<:f> argument values are:
  2698. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2699. <:s><:I0,720,1062,0><:S+-1><:R1,14,1,720,1,1062,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#240,6624>0    Used for normal commands.
  2700. <:s><:I0,720,1062,0><:S+-1><:R1,14,1,720,1,1062,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1440,6624>1    The player typed an unknown word, and the parser is reading a new command that can be an "oops" command. If the player types a command line that begins with the word "oops" (or "o"), the parser will substitute the next word for the unknown word in the pre
  2701. vious command, and go back to parsing the previous command. Otherwise, the parser treats the new line as a brand new command.
  2702. <:s><:I0,720,1062,0><:S+-1><:R1,14,1,720,1,1062,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1920,6624>2    The player has referred to an ambiguous object, and the parser wants the user to provide more information. The parser displays a message such as "Which book do you mean, the red book, the blue book, or the green book?", and then reads a command with promp
  2703. t 2. If the player types something that looks like an answer to the question (for example, "the blue one" or "green book" or simply "red"), the parser uses that information to disambiguate the object; otherwise, it treats the new line as a brand new command
  2704. <:s><:I0,720,1062,0><:S+-1><:R1,14,1,720,1,1062,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1440,6624>3    The player has typed a command that has no direct object, but the verb requires a direct object. The parser displays a message such as "What do you want to open?", then prompts with prompt 3. If the player responds with an object name, it is used as the d
  2705. irect object of the original command, otherwise the text is treated as a new command.
  2706. <:s><:I0,720,1062,0><:S+-1><:R1,14,1,720,1,1062,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#240,6624>4    The same as 3, but used to prompt for indirect objects.
  2707. <:s><:I0,720,1062,0><:R1,14,1,720,1,1062,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2708. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2730,6624>After the player has typed a command, the parser will tell your game about it by calling your 
  2709. <:f200,QCourier,>preparse<:f> function. Immediately after reading the command line, the parser calls this function with the original text of the player's command as the argument. If you don't provide a 
  2710. <:f200,QCourier,>preparse<:f> function in your game program, the parser skips this step. If you do provide a 
  2711. <:f200,QCourier,>preparse<:f> function, it can return one of three values:  it can return 
  2712. <:f200,QCourier New,>true<:f>, in which case the command is processed as normal; it can return 
  2713. <:f200,QCourier New,>nil<:f>, in which case the command is skipped entirely, and the parser immediately asks the player for a new command; or it can return a string, in which case the returned string is used as the command instead of the line of text typed 
  2714. by the player.
  2715. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>Here's an example definition of <:f200,QCourier New,>commandPrompt<:f> that displays a long prompt for the first few commands, then changes to a shorter prompt.  The longer prompt is not displayed when the parser asks the player a question.
  2716. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2717. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>commandPrompt: function(typ)
  2718. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>{
  2719. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    if (global.promptTurns = nil)
  2720. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        global.promptTurns := 0;
  2721. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    
  2722. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    "\b";
  2723. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    if (typ = 0 or typ = 1)
  2724. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    {
  2725. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        global.promptTurns++;
  2726. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        if (global.promptTurns << 5)
  2727. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>            "What do you want to do now?\n";
  2728. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        else if (global.promptTurns = 5)
  2729. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>            "Aren't you tired of this long prompt?
  2730. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>             I sure am.  From now on, the prompt
  2731. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>             will just be like this:\n";
  2732. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    }
  2733. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    "<;>";
  2734. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>}<:f>
  2735. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2736. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>If the player enters a blank line in response to a command prompt, the parser calls a function called 
  2737. <:f200,QCourier New,>pardon<:f> in your game program.  You must provide a function with this name.  This function takes no arguments; its only purpose is to provide an opportunity for you to display an error message when the player enters an empty command.  
  2738. Here's an example:
  2739. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2740. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>pardon: function
  2741. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>{
  2742. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    "I beg your pardon?";
  2743. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>}<:f>
  2744. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>
  2745. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>
  2746. @Header@<:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#370,6624>Breaking the command into words
  2747. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2748. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>Once the parser has read a line of text from the user, the next step is to break the command into individual words. The parser does this based entirely on the characters in the command line--at this stage, it doesn't pay any attention to whether it recogniz
  2749. es any of the words. People who write compilers call this step "lexical analysis" or "tokenization," because it involves breaking up a string of characters into individual units (or "tokens") by classifying the characters and grouping related characters.
  2750. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>First, the parser converts the entire command to lower-case. Next, the parser simply goes through the command line, and takes each group of letters and numbers to be a word, and keeps any strings enclosed in double quotes together.
  2751. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>For example, assume the player types this:
  2752. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2753. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Joe, Go West, then type "hello, world!" on the Acme-Tech computer's keyboard.
  2754. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2755. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>The parser converts this to a string of words and symbols:
  2756. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2757. <:I0,360,0,0><:S+-1><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#192,6624><:f180,QCourier New,>joe
  2758. <:s><:I0,360,0,0><:S+-1><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#192,6624><:f180,QCourier New,>,
  2759. <:s><:I0,360,0,0><:S+-1><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#192,6624><:f180,QCourier New,>go
  2760. <:s><:I0,360,0,0><:S+-1><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#192,6624><:f180,QCourier New,>west
  2761. <:s><:I0,360,0,0><:S+-1><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#192,6624><:f180,QCourier New,>,
  2762. <:s><:I0,360,0,0><:S+-1><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#192,6624><:f180,QCourier New,>then
  2763. <:s><:I0,360,0,0><:S+-1><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#192,6624><:f180,QCourier New,>type
  2764. <:s><:I0,360,0,0><:S+-1><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#192,6624><:f180,QCourier New,>"hello, world!"
  2765. <:s><:I0,360,0,0><:S+-1><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#192,6624><:f180,QCourier New,>on
  2766. <:s><:I0,360,0,0><:S+-1><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#192,6624><:f180,QCourier New,>the
  2767. <:s><:I0,360,0,0><:S+-1><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#192,6624><:f180,QCourier New,>acme-tech
  2768. <:s><:I0,360,0,0><:S+-1><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#192,6624><:f180,QCourier New,>computer's
  2769. <:s><:I0,360,0,0><:S+-1><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#192,6624><:f180,QCourier New,>keyboard
  2770. <:s><:I0,360,0,0><:S+-1><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#192,6624><:f180,QCourier New,>.<:f>
  2771. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2772. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>Note that the punctuation marks are all treated as separate words, and the spaces are all ignored. Note also that apostrophes and dashes are considered to be equivalent to letters, so things like "Acme-Tech" and "computer's" are treated as single words.
  2773. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2774. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2775. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2776. @Header@<:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#370,6624>Checking for Special Words
  2777. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2778. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>After breaking the command into words, the parser checks the word list for the special words listed in your 
  2779. <:f200,QCourier New,>specialWords<:f> directive. If your game doesn't provide a 
  2780. <:f200,QCourier New,>specialWords<:f> directive, the parser has a built-in list that it uses (since adv.t provides a 
  2781. <:f200,QCourier New,>specialWords<:f> directive, your game probably has one whether you've entered one or not). Any word in the word list that matches one of the special words is converted to a flag indicating that it is that special word.
  2782. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>Note that this conversion doesn't apply to the special word in the "of" slot. This special word is matched later, and not converted along with the other special words, because it is often useful for "of" to be an ordinary preposition, which wouldn't be poss
  2783. ible if it were converted at this point.
  2784. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>As with the previous step, where the command was broken up into words, this step is done automatically by the parser without any calls to your game.
  2785. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2786. @Header@<:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#370,6624>Assembling the Words into Commands
  2787. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2788. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>The next step is to find the individual commands on the command line. The command line can be made up of multiple commands, separated by the words "then" or "and," or by various punctuation marks:  commas, periods, exclamation points, and question marks.
  2789. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>The word "then," and the period, exclamation point, and question mark are unambiguous--they always separate commands. So, the first thing the parser does is scan through the command line, looking for one of these symbols. If it finds one or more at the begi
  2790. nning of the command, it simply discards them. Otherwise, it takes all of the words up to the first occurrence of one of these symbols, and treats that as a command. For example, consider this command:
  2791. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2792. <:s><:I0,360,720,360><:S+-1><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#384,6624><:f180,QCourier New,>Joe, go west, then open the door and the window and go east.<:f>
  2793. <:s><:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2794. <:s><:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>The parser takes the part up to the "then" as the first command. It keeps doing the same thing through the rest of the command, which means that it will at this point break the line up into two commands:
  2795. <:s><:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2796. <:s><:I0,360,0,0><:S+-1><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#192,6624><:f180,QCourier New,>Joe, go west
  2797. <:s><:I0,360,0,0><:S+-1><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#192,6624><:f180,QCourier New,>open the door and the window and go east<:f>
  2798. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2799. <:s><:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>Note that the word "and" and the comma are ambiguous, since they may separate entire commands, or objects within a single command. The parser delays any decisions about these symbols until it has further analyzed the command; so, although the second line ab
  2800. ove actually consists of two separate commands, the parser at this point is considering it to be a single command.
  2801. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>The parser now processes these commands individually. It processes each part of the command in sequence, until either it has processed all of the commands, or an error occurs, or your game program executes an 
  2802. <:f200,QCourier New,>exit<:f> or <:f200,QCourier New,>abort<:f> command.
  2803. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2804. @Header@<:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#370,6624><:ZCheckActor><:Z~CheckActor>Checking for an Actor
  2805. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2806. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>Now the parser starts processing the individual commands making up the command line. The first thing it does is to check for an actor prefix. The player can specify that a command is to be given to a particular actor by putting the actor's name followed by 
  2807. a comma at the very start of a command. The sentence "Joe, go west" starts with an actor's name and a comma, so the command "go west" is directed to Joe.
  2808. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>Checking for an actor is the first processing of the command that involves the vocabulary words defined by your game (other than the special words). To determine if the group of words in front of the comma is indeed the name of an actor, the parser looks at
  2809.  each word in turn, and applies the noun-checking rules; see the section on noun phrases (page 
  2810. <:X3,-16384;PageRef NounPhrases>80<:X~3,-16384;PageRef NounPhrases>) for details on these rules.
  2811. <+C><:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2184,6624>If the words do form a noun phrase, the parser will next attempt to determine if the noun phrase refers to an object that can be used as an actor. To do this, it first forms a list of all of the objects in the game that match all of the words in the noun ph
  2812. rase. For example, if the sentence starts with "black knight," the parser builds a list of all of the objects in the game that have both the adjective "black" and the noun "knight."  If the list has more than one object, the noun phrase is ambiguous, so the
  2813.  parser must "disambiguate" the object to determine what the player intended.
  2814. <+C><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>First, the parser goes through the list and notes which objects in it are visible. To do this, it calls the method 
  2815. <:f200,QCourier New,>isVisible(Me)<:f> on each object in the list--this method returns 
  2816. <:f200,QCourier New,>true<:f> if the object is visible from the given vantage point (<:f200,QCourier New,>Me<:f>, the player actor), 
  2817. <:f200,QCourier New,>nil<:f> if not. This step is used entirely to determine how to report any errors that happen later; an object may be visible, but not valid as an actor, in which case a different message is required than if the object isn't present at a
  2818. <+C><:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2457,6624>Next, the parser determines whether each object can be used as an actor. For each object, the parser calls the 
  2819. <:f200,QCourier New,>validActor<:f> method, which returns <:f200,QCourier New,>true<:f> if the object can be used as an actor. The default definition of this method in adv.t returns 
  2820. <:f200,QCourier New,>true<:f> for any object if the object can be reached by the player. You can override this method to achieve different effects; for example, if the player is carrying a walkie-talkie, you could make any actors that have the other walkie-
  2821. talkie valid as actors, since they can hear the player through the radio, even though they may not be in the same room.
  2822. <+C><:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>Note that <:f200,QCourier New,>validActor<:f> is intended to determine whether an object is 
  2823. <+">valid<-"> as an actor, not necessarily whether the object is <+">logical<-"> as an actor. Hence, the 
  2824. <:f200,QCourier New,>validActor<:f> method defined in adv.t applies to 
  2825. <+">all<-"> objects, not just actors. This method is used in determining whether an object can be addressed by the player at all; if a head of lettuce is present in the same room, the player should be able to address it, even though doing so may not do any 
  2826. good.
  2827. <+C><:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>For any object which passes the <:f200,QCourier New,>validActor<:f> test, the parser notes whether the object is a "preferred" actor, by calling the 
  2828. <:f200,QCourier New,>preferredActor<:f> method on each object. This method returns 
  2829. <:f200,QCourier New,>true<:f> if the object is generally suitable for use as an actor, 
  2830. <:f200,QCourier New,>nil<:f> otherwise. The default definitions in adv.t return 
  2831. <:f200,QCourier New,>true<:f> for this method for all objects of class Actor, 
  2832. <:f200,QCourier New,>nil<:f> for other types of objects.
  2833. <+C><:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>After removing all objects that failed the <:f200,QCourier New,>validActor<:f> test, the parser looks at its list to see what's left.
  2834. <+C><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2457,6624>If no objects remain, the player has tried to talk to something that is not currently accessible as an actor, or which doesn't exist at all. If none of the objects in the original list were visible, the parser issues error 9:  "I don't see any %s here."  (N
  2835. ote that the "%s" is replaced with the text of the player's noun phrase. So, if the original command was "Joe, Go West", the error message reads:  "I don't see any joe here.")  The reason the parser uses the player's original words in the error message is t
  2836. hat the parser can't determine what object the player is referring to--it can only use the words the player originally entered. Note that the parser always converts the player's words to lower-case.
  2837. <+C><:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2184,6624>If more than one object remains, the parser goes back and looks at the results of the 
  2838. <:f200,QCourier New,>preferredActor<:f> method for each object remaining. If any objects returned 
  2839. <:f200,QCourier New,>true<:f> from this method, the parser considers only those objects; if all returned 
  2840. <:f200,QCourier New,>nil<:f>, the parser ignores the <:f200,QCourier New,>preferredActor<:f> results and keeps the original list. If exactly one object returned 
  2841. <:f200,QCourier New,>true<:f> from <:f200,QCourier New,>preferredActor<:f>, the parser uses that object as the actor. Otherwise, it must ask the player which of the remaining objects was intended; this process is the same as for any other object, and is des
  2842. cribed below.
  2843. <+C><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>If exactly one object remains, the parser uses that object as the actor. The process of determining the actor is completed.
  2844. @Header@<:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#370,6624><:ZIdentVerb><:Z~IdentVerb>Identifying the Verb
  2845. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2846. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>Once the actor (or absence of an actor) has been determined, the parser finds the verb. This is one of the simpler parts of parsing, because the verb must always be the first word of the command. The parser takes the first word and checks to make sure it ca
  2847. n be used as a verb; if not, message 17 ("There's no verb in that sentence!") is displayed, and the command is aborted.
  2848. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#3003,6624>When you define a verb, you can specify one word or two. For example, the verb "take" is specified with a single word, whereas "pick up" is specified with two words. In English (and some other languages), a preposition can be associated with a verb in such 
  2849. a way that it effectively becomes part of the verb--the preposition's presence changes the meaning of the verb so much that the verb-preposition combination is effectively a whole new verb:  "throw away" has a meaning entirely different from "throw."  TADS 
  2850. supports this construct with two-word verbs. Note that when you define a two-word verb, the second word in the two-word verb must be separately defined as a preposition--the parser does not automatically create a preposition for the word. For example, a ver
  2851. b defined as "pick up" requires that the preposition "up" be defined as well (these particular examples are defined in adv.t).
  2852. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2184,6624>If the word following the verb is defined as a preposition, the parser checks to see if it's defined as part of a two-word verb with the verb in the sentence. If it is, the parser takes the pair of words as the verb--if the player types "pick up" as the fir
  2853. st two words of a command, the parser takes the pair as the verb-preposition combination. If the preposition does 
  2854. <+">not<-"></`>go with the verb, and the same word can be used as a noun or an adjective, the parser takes the verb to be the first word of the command only, and assumes the second word is being used as part of a noun phrase.
  2855. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>Once the verb is identified as the first one or two words of the sentence, the parser checks to see if anything remains. If the next word is a sentence separator ("and" or a comma), or if no more words follow, the parser takes it as the end of the sentence,
  2856.  and executes the verb without any objects.
  2857. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>If the next word starts a noun phrase, the reads the noun phrase that follows, and then checks to see what follows that. If the next word is a sentence separator, the parser takes it as the end of the sentence, and executes the verb with the noun phrase as 
  2858. the direct object.
  2859. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>If, instead, the next word is a preposition, the parser checks what follows the preposition. If the next word starts another noun phrase, the parser reads this second noun phrase, then executes the command with both a direct and an indirect object,  with th
  2860. e preposition separating them.
  2861. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>If the word following the preposition is a sentence separator, the parser takes the preposition as part of the verb. With verb-preposition combinations, the preposition is sometimes placed immediately after the verb, as in "pick up the book," but can also b
  2862. e put at the end of the sentence, as in "pick it up."   So, if the parser finds a preposition at the end of the sentence, it treats the preposition the same way it would have if the preposition had immediately followed the verb.
  2863. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#3549,6624>Note that many of these cases can be ambiguous--based on the parts of speech of the words in a sentence, more than one interpretation is possible. The parser's rules as described above are designed to choose the most sensible interpretation, but sometimes t
  2864. he results will not be exactly what you may have intended. For example, if your game has an object defined as an "up button" (in an elevator, for example),  the word "up" will end up defined as a verb, preposition, and adjective. If the player types "push u
  2865. p button," and no verb is defined as "push up," the parser will know that "push" and "up" don't go together as a verb and will interpret this as applying the verb "push" to the object "up button."  However, if the player types "pick up button," the parser w
  2866. ill interpret this as applying the verb "pick up" to the object "button"; if you also have a down button, the parser will ask the player which button to take--which would be confusing if the player had intended to apply the verb "pick" to the object "up but
  2867. ton."
  2868. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>Ambiguous word definitions are very difficult to anticipate, because there are so many possible combinations of words in even a small game. The best way to find these is to test your game, and have other people test it.
  2869. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>Note that in the course of identifying the verb, the parser has also identified the noun phrases that make up the direct and indirect objects, and the preposition that separates the direct and indirect objects. For the command "open the door and the window,
  2870. " the parser identifies the following sentence components:
  2871. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2872. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>actor:  Me
  2873. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>verb:  open
  2874. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>direct object:  the door and the window
  2875. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>preposition:  none
  2876. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>indirect object:  none
  2877. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2878. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>For the command "joe, pick up the ball with the tongs," the parser will identify the following elements:
  2879. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2880. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>actor:  Joe
  2881. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>verb:  pick up
  2882. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>direct object:  the ball
  2883. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>preposition:  with
  2884. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>indirect object:  the tongs
  2885. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2886. @Header@<:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#370,6624><:ZNounPhrases><:Z~NounPhrases>Noun Phrases and Objects
  2887. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2888. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>A noun phrase is made up of an optional article, one or more optional adjectives, a noun or a plural, and optionally the word "of" (or an equivalent defined with 
  2889. <:f200,QCourier New,>specialWords<:f>) and another noun phrase. A word is a noun if it matches a word defined in the 
  2890. <:f200,QCourier New,>noun<:f> property of an object in your game; likewise for adjectives, plurals, and articles.
  2891. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2184,6624>Certain special words can be used as noun phrases. The word "all" is by itself a valid noun phrase, as are the pronouns (it, him, her, and them). "All" or "all of" followed by a plural noun phrase (which is a noun phrase whose last word is a plural rather t
  2892. han a noun) is a noun phrase, equivalent to the plural noun phrase without the "all" or "all of."  Similarly, "both" and "both of" can be used in exactly the same way. "Any" followed by a noun phrase, or "any of" followed by a plural noun phrase, can also b
  2893. e used; these tell the parser to arbitrarily pick one of the objects indicated.
  2894. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>The player can also specify a count with a plural or with "any."  For example, phrases such as "3 books," "any 3 books," "3 of the books," and "any 3 of the books" work the same as "any book," but the parser will (arbitrarily) choose three of the named obje
  2895. cts in this case, rather than just one.  If the number is "1," the parser allows this format with a singular noun phrase as well:  "1 book" or "any 1 book," which are equivalent to "any book."
  2896. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>The player can also use multiple noun phrases, by separating each with "and" or a comma.
  2897. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2457,6624>During the first phase of parsing, before starting to execute the command, the parser identifies 
  2898. <+">all<-"> of the possible objects for each noun phrase. After finding the words involved in the noun phrase (which is done entirely on the basis of their defined parts of speech, as described above), the parser makes a list of all of the objects which mat
  2899. ch all of the words in the noun phrase. For example, if the noun phrase is "pile of red paper," the parser finds every object which has "pile" defined as a noun, "red" defined as an adjective, and "paper" defined as a noun. The parser intersects these lists
  2900.  of objects to arrive at a list of objects that have all three words defined.
  2901. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>In most circumstances, a number entered as part of a command serves as a noun, and is assigned to 
  2902. <:f200,QCourier New,>numObj<:f> (see the section on object resolution on page 
  2903. <:X3,-16384;PageRef ObjectResolution>94<:X~3,-16384;PageRef ObjectResolution>).  In some cases, though, you may want to use a number as part of the name of an object.  For example, you might have a five dollar bill, in which case you would want "5" to serve
  2904.  as an adjective for the object.  Similarly, if you have an elevator with a button for each floor, the buttons will be called "button 3," and so on.
  2905. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>The parser allows you to enter numbers as adjectives.  For example:
  2906. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2907. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>button3:  floorButton
  2908. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    adjective = '3' 'three'
  2909. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    floor = 3
  2910. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>;<:f>
  2911. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2912. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>When a number is defined as an adjective, and the object is present, the parser allows the number to be used as either a prefix or a suffix in the noun phrase:  "button 3" and "3 button" (as well as "three button") are valid noun phrases referring to the bu
  2913. tton.
  2914. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2915. @Header@<:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#370,6624>Command Execution:  Part One
  2916. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2917. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>Now that the command has been identified, the parser begins to execute it.
  2918. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>The first step in execution is to call a user function called <:f200,QCourier New,>preparseCmd<:f>. This functional is optional; if your game doesn't define one, the parser skips this step. The parser calls the function with a single parameter:  a list of (
  2919. single-quoted) strings, one string per word in the command. For example, for the command "open the door and the window," the parser calls the function like this:
  2920. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2921. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>preparseCmd(<[>'open' 'the' 'door' ','
  2922. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    'the' 'window'])<:f>
  2923. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2924. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Note that the word "and" became a comma. "And," and certain other words, are transformed internally before this function is called:
  2925. <+@><:s><:I0,360,0,0><:S+-1><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#240,6624>
  2926. <+@><:I0,360,0,0><:S+-1><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#245,6624><:f200,,>    and        <:f180,rZapfDingbats,><\]><:><:><:f180,rZapfDingbats,>    <:f200,,>,
  2927. <+@><:I0,360,0,0><:S+-1><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#245,6624><:f200,,>    all        <:f180,rZapfDingbats,><\]><:><:><:f180,,>    <:f200,,>A
  2928. <+@><:I0,360,0,0><:S+-1><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#245,6624><:f200,,>    but        <:f><:f180,rZapfDingbats,><\]><:f><:><:><:f180,,>    <:f200,,>X
  2929. <+@><:I0,360,0,0><:S+-1><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#245,6624><:f200,,>    it        <:f><:f180,rZapfDingbats,><\]><:f><:><:><:f180,,>    <:f200,,>I
  2930. <+@><:I0,360,0,0><:S+-1><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#245,6624><:f200,,>    them    <:f><:f180,rZapfDingbats,><\]><:f><:><:f180,,>    <:f200,,>T
  2931. <+@><:I0,360,0,0><:S+-1><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#245,6624><:f200,,>    him        <:f><:f180,rZapfDingbats,><\]><:f><:><:f180,,>    <:f200,,>M
  2932. <+@><:I0,360,0,0><:S+-1><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#245,6624><:f200,,>    her        <:f><:f180,rZapfDingbats,><\]><:f><:><:f180,,>    <:f200,,>R
  2933. <+@><:I0,360,0,0><:S+-1><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#245,6624><:f200,,>    any        <:f><:f180,rZapfDingbats,><\]><:f><:><:f180,,>    <:f200,,>Y<:f>
  2934. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2935. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>Your <:f200,QCourier New,>preparseCmd<:f> function can return one of three values:  
  2936. <:f200,QCourier New,>true<:f>, <:f200,QCourier New,>nil<:f>, or a list. If the function returns 
  2937. <:f200,QCourier New,>true<:f>, processing continues as normal. If it returns 
  2938. <:f200,QCourier New,>nil<:f>, the command is abandoned--the parser discards the current command, and goes back to the beginning of the parsing process to get a new command. If the function returns a list, the list must consist entirely of single-quoted stri
  2939. ngs; the parser will go back to the step described above under "Checking for an Actor," substituting the returned list for the original command.
  2940. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>Note that the argument to <:f200,QCourier New,>preparseCmd<:f> doesn't include the actor specification. For example, if the player types "joe, go west," 
  2941. <:f200,QCourier New,>preparseCmd<:f> will receive only "go west."  In addition, the list doesn't include the words separating the command from the previous or next command on the same line. For example, if the player types "go west, then pick up the box," t
  2942. he function is called first with simply "go west," then with "pick up the box."
  2943. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>In addition, this command is called for each command just prior to the steps described below. For example, if the player types "go west, then pick up the box," the parser first calls 
  2944. <:f200,QCourier New,>preparseCmd<:f> with "go west," and then proceeds through the rest of the processing for this command as described below; after that's all done, the parser comes back to this step, calls 
  2945. <:f200,QCourier New,>preparseCmd<:f> with "pick up the box," and then proceeds through the steps below once again.
  2946. <:s><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>The <:f200,QCourier New,>preparseCmd<:f> function is allowed to change a particular command only once. If 
  2947. <:f200,QCourier New,>preparseCmd<:f> returns a list value, the parser goes back and starts processing the list as a new command--as a result, the new command will itself be submitted to 
  2948. <:f200,QCourier New,>preparseCmd<:f> when the parser gets back to this step. On this second call, 
  2949. <:f200,QCourier New,>preparseCmd<:f> is not allowed to return a list; if it does, the parser displays an error that indicates the 
  2950. <:f200,QCourier New,>preparseCmd<:f> appears to be stuck in a loop (message 402) and cancels the command.
  2951. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>Here's a sample implementation of <:f200,QCourier New,>preparseCmd<:f>.  This implementation converts commands in the format "tell 
  2952. <+">actor<-"></`>to <+">command<-">" to the standard TADS notation for these commands, "<+">actor<-">, 
  2953. <+">command<-">."
  2954. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2955. <:I0,432,0,0><:R1,15,1,796,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>preparseCmd: function(cmd)
  2956. <:s><:I0,432,0,0><:R1,14,1,792,1,1174,1,1512,1,1862,1,2160,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>{
  2957. <:I0,432,0,0><:R1,14,1,792,1,1174,1,1512,1,1862,1,2160,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    local i, tot, to_loc, actor, the_rest;
  2958. <:s><:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2959. <:s><:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>    <:f200,QCourier New,>/* see if there's a "to" */<:f>
  2960. <:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>    <:f200,QCourier New,>for (i := 1, tot := length(cmd) ;
  2961. <:s><:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>            i <<= tot ; ++i)
  2962. <:s><:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>      {
  2963. <:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>      if (cmd<[>i] = 'to')
  2964. <:s><:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        {
  2965. <:s><:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>            /* note the location */
  2966. <:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>            to_loc := i;
  2967. <:s><:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    
  2968. <:s><:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>            /* we're done looking */
  2969. <:s><:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>            break;
  2970. <:s><:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        }
  2971. <:s><:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>   <:f><:f200,QCourier New,>}<:f>
  2972. <:s><:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>
  2973. <:s><:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    <:f><:f200,QCourier New,>/* check for TELL actor TO command */
  2974. <:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>   if (tot <;>= 1 and cmd<[>1] = 'tell' and
  2975. <:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        to_loc <<<;> nil and<:f><:f200,QCourier New,> to_loc <;> 2)
  2976. <:s><:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>   {
  2977. <:s><:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        /* get the actor */
  2978. <:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>      for (i := 2, actor := <[>]
  2979. <:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>            ; i << to_loc ; ++i)
  2980. <:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>            <:f><:f200,QCourier New,>actor += cmd<[>i];
  2981. <:s><:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>            
  2982. <:s><:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        /* get the command */
  2983. <:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>      for (the_rest := <[>],<:f><:f200,QCourier New,>i := to_loc+1 ;
  2984. <:s><:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>            i <<= tot ; ++i)
  2985. <:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>          the_rest += cmd<[>i];
  2986. <:s><:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>
  2987. <:s><:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        /* change it to "actor, command" */
  2988. <:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>      return actor + ',' + the_rest;
  2989. <:s><:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    <:f><:f200,QCourier New,>}
  2990. <:s><:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    else
  2991. <:s><:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    {
  2992. <:s><:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        /* process the command unchanged */
  2993. <:s><:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        return true;<:f>
  2994. <:s><:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    }
  2995. <:s><:I0,432,0,0><:R1,14,1,792,1,1152,1,1512,1,1862,1,2232,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>}
  2996. <:s><:I0,432,0,0><:R1,14,1,792,1,1174,1,1512,1,1862,1,2160,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  2997. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>After <:f200,QCourier New,>preparseCmd<:f> returns true, the parser makes sure it has a valid 
  2998. <:f200,QCourier New,>deepverb<:f> object for the verb phrase. If no object is found that defines the verb phrase as one of its 
  2999. <:f200,QCourier New,>verb<:f> property values, the parser displays an error (message 18, "I don't understand that sentence") and cancels the commands.
  3000. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>Next, the parser runs the <:f200,QCourier New,>roomCheck<:f> method in the object 
  3001. <:f200,QCourier New,>Me<:f>. The <:f200,QCourier New,>roomCheck<:f> method is called with a single argument:  the 
  3002. <:f200,QCourier New,>deepverb<:f> object. For example, if the player types "take book," the parser calls this method:
  3003. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3004. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>Me.roomCheck(takeVerb)<:f>
  3005. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3006. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>This method should return either <:f200,QCourier New,>true<:f> or 
  3007. <:f200,QCourier New,>nil<:f>:  a return value of <:f200,QCourier New,>true<:f> indicates that the command is allowed to proceed. If 
  3008. <:f200,QCourier New,>roomCheck<:f> returns <:f200,QCourier New,>nil<:f>, the command is canceled. The 
  3009. <:f200,QCourier New,>roomCheck<:f> method is expected to display a message indicating why the command is not allowed, so the parser doesn't display any additional information when 
  3010. <:f200,QCourier New,>roomCheck<:f> returns <:f200,QCourier New,>nil<:f>--it simply cancels the command without further comment.
  3011. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2457,6624>The <:f200,QCourier New,>roomCheck<:f> method is intended to be a first, coarse check of whether a command is valid in a room. This method is called prior to any disambiguation, and once for the entire command (regardless of how many direct objects may be i
  3012. nvolved in the command). The main use of this method is to disallow entire verbs in a room based on the room's condition; for example, you could use 
  3013. <:f200,QCourier New,>roomCheck<:f> to prevent the player from being able to take any objects while in the dark. Since this method is called prior to disambiguation, you can prevent the disambiguation process from displaying any information about the room th
  3014. at the player should not be able to see.
  3015. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2457,6624>The default <:f200,QCourier New,>roomCheck<:f> defined in the <:f200,QCourier New,>basicMe<:f> class in adv.t simply returns the value of the 
  3016. <:f200,QCourier New,>roomCheck<:f> method in the player's location. (The 
  3017. <:f200,QCourier New,>roomCheck<:f> defined in the <:f200,QCourier New,>movableActor<:f> class does the same thing for the actor's location.)  The 
  3018. <:f200,QCourier New,>roomCheck<:f> defined in the <:f200,QCourier New,>room<:f> class in adv.t always returns 
  3019. <:f200,QCourier New,>true<:f>, and the <:f200,QCourier New,>roomCheck<:f> defined in the 
  3020. <:f200,QCourier New,>darkroom<:f> class in adv.t returns <:f200,QCourier New,>nil<:f> unless the location is lit, or the verb is a "dark verb" (i.e., its 
  3021. <:f200,QCourier New,>isDarkVerb<:f> property is <:f200,QCourier New,>true<:f>), which means that it can be used in the dark. All "system" verbs (such as "save" and "restore"), as well as a few other verbs that don't logically require light (such as "wait"),
  3022.  are defined in adv.t as dark verbs.
  3023. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3024. @Header@<:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#370,6624><:ZVerbTemplates><:Z~VerbTemplates>Verb Templates
  3025. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3026. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>The parser must now determine how to execute the command. The first step is to identify the 
  3027. <:f200,QCourier New,>deepverb<:f> object associated with the word or words making up the verb; to do this, the parser simply looks up the verb phrase in its dictionary, and finds the object that defined the phrase as one of its 
  3028. <:f200,QCourier New,>verb<:f> property values.
  3029. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>A single <:f200,QCourier New,>deepverb<:f> can have multiple interpretations; these interpretations are called "templates," because they serve as models for the possible sentences that can be made with the verb.
  3030. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2457,6624>TADS verb templates are a subtle concept, because templates are not explicitly stated in a 
  3031. <:f200,QCourier New,>deepverb<:f>; rather, they are <+">implied<-"> by the presence of the properties 
  3032. <:f200,QCourier New,>action<:f>, <:f200,QCourier New,>doAction<:f>, and 
  3033. <:f200,QCourier New,>ioAction<:f>.  If an <:f200,QCourier New,>action<:f> method exists for the verb, the template sentence that consists only of the verb is implicitly defined.  If a 
  3034. <:f200,QCourier New,>doAction<:f> property exists for the verb, the template sentence that consists of the verb and a direct object is implicitly defined.  If an 
  3035. <:f200,QCourier New,>ioAction<:f> property is defined for a particular preposition object, the verb implicitly defines the template sentence that consists of the verb, a direct object, the specified preposition, and an indirect object.
  3036. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>The "wait" verb defined in adv.t defines only the no-object template:
  3037. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3038. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>waitVerb:  darkVerb
  3039. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    verb = 'wait'  'z'
  3040. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    action(actor) =
  3041. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    {
  3042. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        "Time passes...\n";
  3043. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    }
  3044. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>;<:f>
  3045. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3046. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>The "lock" verb defined in adv.t defines both a one-object and two-object template, but doesn't have a no-object template:
  3047. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3048. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>lockVerb:  deepverb
  3049. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    verb = 'lock'
  3050. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    sdesc = "lock"
  3051. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    ioAction(withPrep) = 'LockWith'
  3052. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    doAction = 'Lock'
  3053. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    prepDefault = withPrep
  3054. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>;<:f>
  3055. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3056. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>Note that the <:f200,QCourier New,>ioAction<:f> definition can contain certain special flags that affect the way commands matching the template are processed.  For example, you could define a template as follows:
  3057. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3058. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>    <:f200,QCourier New,>ioAction(aboutPrep) =
  3059. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>         <[>disambigDobjFirst]'TellAbout'<:f>
  3060. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3061. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2457,6624>The <:f200,QCourier New,><[>disambigDobjFirst]<:f> flag (which is the only flag currently defined) specifies that the parser is to disambiguate the direct object first when a sentence involving this template is executed.  Normally, the parser disambiguates 
  3062. the indirect object first, then disambiguates the direct object with the indirect object known.  For some commands this is undesirable, because it means that the direct object isn't known when the indirect object is being disambiguated.  This flag provides 
  3063. control over the sequence of disambiguation, so that you can determine which object is known first, which allows you to use that object while disambiguating the other.
  3064. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>To choose a template, the parser uses the components of the command, which were determined earlier (see the section "Identifying the Verb" on page 
  3065. <:X3,-16384;PageRef IdentVerb>78<:X~3,-16384;PageRef IdentVerb>). If the only non-empty component of the command is the verb, the parser chooses the no-object template; if the 
  3066. <:f200,QCourier New,>deepverb<:f> defines an <:f200,QCourier New,>action<:f> method, it has a no-object template, and therefore allows no-object sentences.
  3067. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2184,6624>If the sentence has a verb and a direct object, but no preposition or indirect object, the parser chooses the one-object template. If the 
  3068. <:f200,QCourier New,>deepverb<:f> has a <:f200,QCourier New,>doAction<:f> property, the verb has a one-object template, and thus allows single-object sentences. The 
  3069. <:f200,QCourier New,>doAction<:f> property specifies the verification and action methods for the command:  TADS appends the string defined by 
  3070. <:f200,QCourier New,>doAction<:f> to the string "verDo" to form the verification method, and "do" to form the action method. For example, if 
  3071. <:f200,QCourier New,>doAction<:f> <:f200,QCourier New,>= 'Take'<:f>, the verification method is called 
  3072. <:f200,QCourier New,>verDoTake<:f>, and the action method is called 
  3073. <:f200,QCourier New,>doTake<:f>.
  3074. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#3003,6624>If the sentence has a verb, direct object, preposition, and direct object, the parser uses a two-object template. A single 
  3075. <:f200,QCourier New,>deepverb<:f> object can define multiple two-object templates; these multiple templates are distinguished from one another by their prepositions. The templates are defined by the 
  3076. <:f200,QCourier New,>ioAction<:f> property--each <:f200,QCourier New,>ioAction<:f> specifies the preposition which identifies it. If the player types "dig in dirt with shovel," the parser looks in 
  3077. <:f200,QCourier New,>digVerb<:f> for an <:f200,QCourier New,>ioAction(withPrep)<:f> definition. (Note that 
  3078. <:f200,QCourier New,>digVerb<:f>. and <:f200,QCourier New,>withPrep<:f> could actually be called anything--we're following the naming conventions used in adv.t here, but you can call verb and preposition objects anything you want. The parser doesn't identif
  3079. y these objects based on their names, but rather based on their vocabulary words, defined by their 
  3080. <:f200,QCourier New,>verb<:f> and <:f200,QCourier New,>preposition<:f> properties, respectively.)
  3081. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>The parser must now match the components of the sentence entered by the player with the templates available for the verb. Before going on, the parser checks to make sure that the verb object is properly defined:  it must define at least one sentence templat
  3082. e. If the <:f200,QCourier New,>deepverb<:f> object fails to define any templates (that is, it has no 
  3083. <:f200,QCourier New,>action<:f>, <:f200,QCourier New,>doAction<:f>, or 
  3084. <:f200,QCourier New,>ioAction<:f> properties), the parser displays an error (message 23) and cancels the command.
  3085. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3086. <:s><:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>Case 1:  A Command with No Objects<-!>
  3087. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>If the player's command has no objects at all, but consists only of a verb, the parser checks to see if the 
  3088. <:f200,QCourier New,>deepverb<:f> has an <:f200,QCourier New,>action<:f> method; if so, the parser chooses the verb-only sentence template and proceeds with the execution.
  3089. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>If the command has no objects, and the <:f200,QCourier New,>deepverb<:f> object does 
  3090. <+">not<-"> define an <:f200,QCourier New,>action<:f> method, the parser tries to provide a default direct object by calling the 
  3091. <:f200,QCourier New,>doDefault<:f> (which stands for "direct-object default") method in the 
  3092. <:f200,QCourier New,>deepverb<:f> object. This method is called with the actor, the preposition, and 
  3093. <:f200,QCourier New,>nil<:f> (since the indirect object is not yet known) as arguments. For example, if the player types simply "pick up," the parser chooses 
  3094. <:f200,QCourier New,>takeVerb<:f> as the <:f200,QCourier New,>deepverb<:f> object, sees that it has no 
  3095. <:f200,QCourier New,>action<:f> property, so attempts to obtain a default object:
  3096. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3097. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>takeVerb.doDefault(Me, nil, nil)<:f>
  3098. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>
  3099. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>This method is meant to return a list of objects that should be used by default for the command; the definition of this method for the 
  3100. <:f200,QCourier New,>takeVerb<:f> defined in adv.t returns a list of all movable objects in the player's location. If this method fails to return a list, the parser simply asks the player to supply a direct object (see below). Otherwise, the parser now gets
  3101.  the value of the <:f200,QCourier New,>prepDefault<:f> property in the 
  3102. <:f200,QCourier New,>deepverb<:f> object:  if this value is not <:f200,QCourier New,>nil<:f>, it must refer to a preposition object, which becomes the preposition for the command. 
  3103. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>For example, if the player simply types "dig," the parser gets the default list from the 
  3104. <:f200,QCourier New,>doDefault<:f> method defined in <:f200,QCourier New,>digVerb<:f>, then gets the value of 
  3105. <:f200,QCourier New,>digVerb.prepDefault<:f>. Suppose that <:f200,QCourier New,>prepDefault<:f> has a value of 
  3106. <:f200,QCourier New,>withPrep<:f>:  the command's components now look like this:
  3107. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3108. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>actor:  Me
  3109. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>verb:  dig
  3110. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>direct object:  (the list returned by <:f200,QCourier New,>doDefault<:f>)
  3111. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>preposition:  with
  3112. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>indirect object:  <:f200,QCourier New,>nil<:f> (because it's not yet known)
  3113. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3114. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>The parser checks that the template specified by the new components exists for the verb.  If it doesn't, the parser skips checking the 
  3115. <:f200,QCourier New,>doDefault<:f> return value, and goes on to ask for a direct object.
  3116. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#3003,6624>If a valid list resulted from <:f200,QCourier New,>doDefault<:f>, and the new template is valid, the parser goes through the 
  3117. <:f200,QCourier New,>doDefault<:f> list to check each item with the direct object verification method defined by the 
  3118. <:f200,QCourier New,>doAction<:f> or <:f200,QCourier New,>ioAction<:f> method for the new template.  If the template is a single-object sentence, which means that the 
  3119. <:f200,QCourier New,>doAction<:f> definition is used, the parser calls the verification method with the actor as a parameter.  If the template is for a two-object sentence, which means that the 
  3120. <:f200,QCourier New,>ioAction<:f> definition is used, the parser calls the verification method with the actor and 
  3121. <:f200,QCourier New,>nil<:f> (because the indirect object is not yet known) as parameters.  If the 
  3122. <:f200,QCourier New,>ioAction<:f> is used, but the <:f200,QCourier New,>ioAction<:f> template specifies the 
  3123. <:f200,QCourier New,><[>disambigDobjFirst]<:f> flag, the second (<:f200,QCourier New,>nil<:f>) parameter is omitted.  Some examples:
  3124. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3125. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+">object<-">.<:f200,QCourier New,>verDoTake(Me)<:f>
  3126. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+">object<-">.<:f200,QCourier New,>verDoLockWith(Me, nil)<:f>
  3127. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+">object<-">.verDoTellAbout(Me)
  3128. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3129. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>In this third example, we're assuming that <:f200,QCourier New,>tellVerb<:f>'s 
  3130. <:f200,QCourier New,>ioAction<:f> property has the <:f200,QCourier New,><[>disambigDobjFirst]<:f> flag.
  3131. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>The verification methods are called silently, which means that any messages they display are hidden from the user (the same as during the disambiguation process).  However, the parser notes whether these methods attempt to display any messages; any verifica
  3132. tion method that attempts to display a message is considered to fail.  The parser discards any objects from the list whose verification method fails.
  3133. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2457,6624>If exactly one object from the <:f200,QCourier New,>doDefault<:f> list passes the silent verification test, that object is chosen as the default direct object for the command.  The parser displays the object to the player:  if your game program defines the 
  3134. function <:f200,QCourier New,>parseDefault<:f>, the parser calls this function with the chosen default object as the parameter, and expects that the function will display a message to indicate that the object has been chosen as the default.  Otherwise, the 
  3135. parser displays message 130 ("("), then calls the method <:f200,QCourier New,>thedesc<:f> in the default object, then displays message 131 (")").  It then starts this step over again with the new set of command components.
  3136. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>Here's a sample implementation of <:f200,QCourier New,>parseDefault<:f>.  This definition generates the same message that the parser would if 
  3137. <:f200,QCourier New,>parseDefault<:f> weren't defined.
  3138. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3139. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>parseDefault: function(obj, prp)
  3140. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>{
  3141. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    "(";
  3142. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    if (prp) "<<<<prp.sdesc<;><;> ";
  3143. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    obj.thedesc;
  3144. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    ")";
  3145. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>}<:f>
  3146. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3147. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>If no objects survive the verification test, the parser doesn't have any way to supply a default object.  If more than one object survives, the parser still does not supply a default object, because the command doesn't imply a specific object.  In either ca
  3148. se, the parser now asks the player to supply a direct object; see the description below.
  3149. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>
  3150. <:s><:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>Case 2:  A Command with One Object<-!>
  3151. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>If the player's command has a direct object, but no preposition or indirect object, the parser checks the verb for a single-object sentence template.  If the 
  3152. <:f200,QCourier New,>deepverb<:f> object has a <:f200,QCourier New,>doAction<:f> property, the single-object sentence is allowed.  The parser first disambiguates the direct object list (see the section on resolving objects on page 
  3153. <:X3,-16384;PageRef ObjectResolution>94<:X~3,-16384;PageRef ObjectResolution>).  If this succeeds, the parser saves the direct object (or list of direct objects) for future use as "it" or "them" (or "him" or "her," if appropriate), and proceeds to execute t
  3154. he command.
  3155. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2184,6624>If a single-object sentence is not allowed, the parser checks the 
  3156. <:f200,QCourier New,>prepDefault<:f> property of the <:f200,QCourier New,>deepverb<:f> object; if it's 
  3157. <:f200,QCourier New,>nil<:f>, the sentence is not allowed, so the parser displays message 24 ("I don't recognize that sentence") and terminates the current command.  Otherwise, the parser uses the 
  3158. <:f200,QCourier New,>prepDefault<:f> value as the preposition for the command, and calls the 
  3159. <:f200,QCourier New,>ioDefault<:f> method of the <:f200,QCourier New,>deepverb<:f> with the actor and preposition as arguments.  For example, if the player types "put ball," and the verb has a default preposition of "in," the parser calls 
  3160. <:f200,QCourier New,>ioDefault<:f> like this:
  3161. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3162. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>putVerb.ioDefault(Me, inPrep)<:f>
  3163. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3164. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2184,6624>If this method returns something other than a list, the parser ignores it, and asks the player to supply an indirect object (see below).  Otherwise, the parser checks to see if the direct object must be disambiguated prior to the indirect object--if the 
  3165. <:f200,QCourier New,>ioAction<:f> property defines the <:f200,QCourier New,><[>disambigDobjFirst]<:f> flag, the direct object must be disambiguated first.  If so, the parser disambiguates the direct object using the normal process (see the section on disamb
  3166. iguation on page <:X3,-16384;PageRef ObjectResolution>94<:X~3,-16384;PageRef ObjectResolution>).  Next, the parser goes through the 
  3167. <:f200,QCourier New,>ioDefault<:f> list, and silently calls the verification method for each object.  For normal verbs, these calls look like this:
  3168. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3169. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+">object<:f200,QCourier New,><-">.verIoPutIn(Me)<:f>
  3170. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3171. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>When the <:f200,QCourier New,>ioAction<:f> property has the <:f200,QCourier New,><[>disambigDobjFirst]<:f> flag, these calls look like this:
  3172. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3173. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+">object<:f200,QCourier New,><-">.verIoPutIn(Me, <+"><:f>directObject<:f200,QCourier New,><-">)<:f>
  3174. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3175. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>These calls are made silently--any messages they display are hidden from the player.  However, the parser notes whether they attempt to display anything; any verification method that attempts to display a message is considered to have failed.  The parser re
  3176. moves from the <:f200,QCourier New,>ioDefault<:f> any objects whose verification method fails at this point.
  3177. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#4095,6624>If exactly one object survives this test, the parser uses this object as the default indirect object and proceeds with the command.  First, though, it shows the player that the object is being assumed.  If your game defines a function called 
  3178. <:f200,QCourier New,>parseDefault<:f>, the parser calls this function with the verb and the preposition as arguments.  Note that you must define 
  3179. <:f200,QCourier New,>parseDefault<:f> to take a variable argument list, because it can be called with either one or two arguments:  when called with one argument, it means that the a default direct object is being assumed; when called with two arguments, it
  3180.  means that a default indirect object is being assumed.  Note further that the preposition supplied as the second argument can be 
  3181. <:f200,QCourier New,>nil<:f>, which will be the case when a two-object command is entered that has no preposition (for example:  "give joe the bottle").    If your game doesn't define a 
  3182. <:f200,QCourier New,>parseDefault<:f> function, the parser generates a message by displaying message number 130 ("("), then calling the preposition object's 
  3183. <:f200,QCourier New,>sdesc<:f> method, then displaying message 132 (a space), then calling the default indirect object's 
  3184. <:f200,QCourier New,>thedesc<:f> method, and then displaying message 131 (")").
  3185. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>If no objects survive the verification test, the parser can't supply a default indirect object.  If more than one object survives, the parser doesn't supply a default indirect object, because the command doesn't imply a particular object.  In either case, t
  3186. he parser asks the player to supply an indirect object (see below).
  3187. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3188. <:s><:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>Case 3:  A Command with Two Objects<-!>
  3189. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#3003,6624>If the player specifies a command with two objects and no preposition, the parser treats the first object as the indirect object, and the second as the direct object, and uses the two-object sentence format.  When this type of sentence is entered, the parse
  3190. r gets the value of the <:f200,QCourier New,>deepverb<:f> object's 
  3191. <:f200,QCourier New,>nilPrep<:f> property--this property should return a preposition object that is to be used for a sentence of this type.  If 
  3192. <:f200,QCourier New,>nilPrep<:f> doesn't return a preposition object, the parser assumes that the preposition is "to," and finds the preposition object with that vocabulary word.  In any case, the parser transforms the sentence from the format VERB IOBJ DOB
  3193. J to the standard two-object sentence format, VERB DOBJ PREP IOBJ, then proceeds with the command as though it had been entered that way in the first place.
  3194. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>If the player enters a command in the format VERB PREP OBJ1 OBJ2, the parser converts this to VERB OBJ2 PREP OBJ1--in other words, the original sentence is interpreted as VERB PREP IOBJ DOBJ.  After the conversion, the parser proceeds with the sentence as t
  3195. hough it had originally been entered as VERB DOBJ PREP IOBJ.  This conversion is most useful for some non-English languages; English speakers don't typically use this construction.
  3196. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>If the player specifies a command with a preposition and one or two objects, the parser finds the 
  3197. <:f200,QCourier New,>ioAction<:f> definition that matches the given preposition.  If the verb doesn't have an appropriate 
  3198. <:f200,QCourier New,>ioAction<:f> property, the parser displays message 24 ("I don't understand that sentence"), and abandons the command.
  3199. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>If only one object was provided, the parser takes the object that was given as the indirect object, and attempts to find a direct object.  The parser uses the same mechanism to find the direct object--first by trying to find a default direct object, then by
  3200.  asking the player--as described above in Case 1.  This type of sentence is useful when the 
  3201. <+">direct<-"></`>object is implied by the verb; for example, if a single actor is present in the room with the player, the direct object of "ask about the murder" would implicitly be the actor.
  3202. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>If two objects are provided, the parser disambiguates the two objects.  If the 
  3203. <:f200,QCourier New,>ioAction<:f> has the <:f200,QCourier New,><[>disambigDobjFirst]<:f> flag, the parser disambiguates the direct object first; otherwise, it disambiguates the indirect object first.  It then disambiguates the other object.  See the section
  3204.  on resolving objects (page <:X3,-16384;PageRef ObjectResolution>94<:X~3,-16384;PageRef ObjectResolution>) for details.
  3205. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2184,6624>The parser never allows a command to use multiple indirect objects.  If the command contains more than one indirect object, the parser displays message 25 ("You can't use multiple indirect objects") and abandons the command.  When the direct object is disam
  3206. biguated first (which will happen only when the <:f200,QCourier New,>ioAction<:f> has the 
  3207. <:f200,QCourier New,><[>disambigDobjFirst]<:f> flag), the parser also restricts the direct object to a single object; if multiple direct objects are specified in this case, the parser displays message 28 ("You can't use multiple objects with this command") 
  3208. and abandons the command.
  3209. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>Once the objects have been disambiguated, the parser saves the direct object or objects as "it" or "them" (or "him" or "her," as appropriate), then executes the command.
  3210. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3211. <:s><:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>Asking for an Object<-!>
  3212. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>If the verb requires a direct or indirect object, but the command doesn't specify one and the parser can't find a suitable default, the parser must ask the player to supply an object for the command.  First, it must display a message asking for the object.
  3213. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#3549,6624>To do this, the parser checks to see if your game program defines a function called 
  3214. <:f200,QCourier New,>parseAskobjActor<:f>; if so, it calls this function with the actor as the first argument, the 
  3215. <:f200,QCourier New,>deepverb<:f> object as the second argument, and the preposition as an optional third argument--this third argument is present only if an indirect object is required, and even then may be 
  3216. <:f200,QCourier New,>nil<:f>.  Your <:f200,QCourier New,>parseAskobjActor<:f> function is expected to display a message asking the player to supply a direct object for the verb.  (Note that if you don't define a 
  3217. <:f200,QCourier New,>parseAskobjActor<:f> function, but you <+">do<-"></`>define a function called 
  3218. <:f200,QCourier New,>parseAskobj<:f>, the function <:f200,QCourier New,>parseAskobj<:f> will be called instead.  
  3219. <:f200,QCourier New,>parseAskobj<:f> has the same purpose as <:f200,QCourier New,>parseAskobjActor<:f>, but does not receive the actor as a parameter.  
  3220. <:f200,QCourier New,>parseAskobj<:f> is called for compatibility with games written prior to version 2.2; you should use 
  3221. <:f200,QCourier New,>parseAskobjActor<:f> for new games, since this function gives you more information.)
  3222. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2184,6624>Note that the <:f200,QCourier New,>parseAskobjActor<:f> function is called with a third argument only when the parser is asking for an indirect object.  The third argument is the preposition object, which may be 
  3223. <:f200,QCourier New,>nil<:f>.  Because the parser calls <:f200,QCourier New,>parseAskobjActor<:f> with two 
  3224. <+">or<-"> three arguments, depending on whether it's asking for a direct or indirect object, your 
  3225. <:f200,QCourier New,>parseAskobjActor<:f> function must be defined as taking variable arguments.  You can determine if the function is being called with two or three arguments by inspecting the 
  3226. <:f200,QCourier New,>argcount<:f> pseudo-variable.
  3227. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2457,6624>If your game does not have a <:f200,QCourier New,>parseAskobjActor<:f> (or 
  3228. <:f200,QCourier New,>parseAskobj<:f>) function, the parser generates its own message.  If no actor (other than 
  3229. <:f200,QCourier New,>Me<:f>) is specified in the command, the parser displays message 140 ("What do you want to"); if an actor is specified, the parser displays message 148 ("What do you want"), then calls the actor's 
  3230. <:f200,QCourier New,>thedesc<:f> method, then displays message 149 ("to").  Next, the parser calls the 
  3231. <:f200,QCourier New,>sdesc<:f> method in the <:f200,QCourier New,>deepverb<:f> object.  If an indirect object is required, the parser next displays an appropriate pronoun for the direct object, then calls the preposition's 
  3232. <:f200,QCourier New,>sdesc<:f> method (if the preposition is <:f200,QCourier New,>nil<:f>, the parser displays message 142, "to").  Finally, the parser displays message 143 ("?").
  3233. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Here's a sample definition of <:f200,QCourier New,>parseAskobjActor<:f>, which generates the same prompt that the parser would if 
  3234. <:f200,QCourier New,>parseAskobjActor<:f> weren't defined.
  3235. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3236. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>parseAskobjActor: function(a, v, ...)
  3237. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>{
  3238. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    if (argcount = 3<:f><:f200,QCourier New,>)
  3239. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    {<:f>
  3240. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        "What do you want ";
  3241. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        if (a <<<;> Me) a.thedesc;
  3242. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        <:f><:f200,QCourier New,>" to <<<<v.sdesc<;><;> <<<<<:f><:f200,QCourier New,>getarg(3<:f><:f200,QCourier New,>).sdesc<;><;> it?";
  3243. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    }
  3244. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    else
  3245. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    {
  3246. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        "What do you want ";
  3247. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        if (a <<<;> Me) a.thedesc;
  3248. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        "to <<<<v.sdesc<;><;>?";
  3249. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    }
  3250. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>}<:f>
  3251. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3252. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2184,6624>If a pronoun for the direct object is required, the parser checks each object in the direct object list.  If the player explicitly specified multiple direct objects (by using "all" or a list of noun phrases), the parser displays message 144 ("them").  Other
  3253. wise, if every object in the list returns consistent values from <:f200,QCourier New,>isHim<:f> and 
  3254. <:f200,QCourier New,>isHer<:f>, the parser displays message 147 ("them") if all objects return 
  3255. <:f200,QCourier New,>true<:f> for <+">both<-"></`><:f200,QCourier New,>isHim<:f> and 
  3256. <:f200,QCourier New,>isHer<:f>; message 145 ("him") if only <:f200,QCourier New,>isHim<:f> returned 
  3257. <:f200,QCourier New,>true<:f>; message 146 ("her") if only <:f200,QCourier New,>isHer<:f> returned 
  3258. <:f200,QCourier New,>true<:f>; or message 141 ("it") if neither <:f200,QCourier New,>isHim<:f> nor 
  3259. <:f200,QCourier New,>isHer<:f> were <:f200,QCourier New,>true<:f> for all objects.
  3260. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2457,6624>After displaying a message (either with <:f200,QCourier New,>parseAskobjActor<:f> or through a set of messages as described above), the parser allows the user to enter a new command, using 
  3261. <:f200,QCourier New,>commandPrompt<:f> code 3 if asking for a direct object and code 4 for an indirect object.  If the new command appears to consist only of a noun phrase, the parser uses that noun phrase for the missing object, and goes back to the beginn
  3262. ing of this step to process the command with the new noun phrase filling in the missing component.  Note that the player can use anything in this noun phrase that would have been allowed in the command itself, including multiple objects and special words su
  3263. ch as "all."
  3264. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>If the new command does not appear to consist of only a noun phrase, the parser abandons the current command and starts over from the beginning with the new command.  So, when the parser asks the player to supply an object, the player can choose either to a
  3265. nswer the question, or to type a brand new command.
  3266. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3267. @Header@<:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#370,6624><:ZObjectResolution><:Z~ObjectResolution>Resolving the Objects
  3268. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3269. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>After the parser has made a final determination of the form of the sentence, and identified the verb template, it must resolve the noun phrases in the command to game objects.  Up to this point, the parser has been keeping a list of the objects matching eac
  3270. h noun phrase; these lists include all objects in the <+">entire game<-"></`>that match each noun phrase.  At this point, the parser must determine which specific object or objects the player meant for each noun phrase.  This process is called "resolving" o
  3271. r "disambiguating" the object references.
  3272. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Certain special noun phrases can be resolved with very little work.  The player can include a string enclosed in double quotes in a command:
  3273. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3274. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><;>type "hello, world!" on the terminal
  3275. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3276. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>Strings are always mapped to the special object <:f200,QCourier New,>strObj<:f>, which must be supplied by your game program (adv.t provides a class called 
  3277. <:f200,QCourier New,>basicStrObj<:f>, which provides a suitable definition that you can use a superclass of your own 
  3278. <:f200,QCourier New,>strObj<:f> object).  In this case, the parser uses 
  3279. <:f200,QCourier New,>strObj<:f> as the direct object to the command, and sets the 
  3280. <:f200,QCourier New,>value<:f> property of <:f200,QCourier New,>strObj<:f> to the (single-quoted) string value 
  3281. <:f200,QCourier New,>'hello, world!'<:f>.
  3282. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>Likewise, the player can use numbers:
  3283. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3284. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><;>dial 8056 on the phone
  3285. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3286. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>Numbers are mapped to the special object <:f200,QCourier New,>numObj<:f>; as with 
  3287. <:f200,QCourier New,>strObj<:f>, this must be supplied by your game (adv.t provides a 
  3288. <:f200,QCourier New,>basicNumObj<:f> class).  In this example, the direct object will be 
  3289. <:f200,QCourier New,>numObj<:f>, and its <:f200,QCourier New,>value<:f> property will be set to the numeric value 8056.
  3290. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2184,6624>The special words for the pronouns (it, them, him, and her) are taken from the direct object of the previous command.  (Note that you can also set the meaning of the pronouns from within game code, using the 
  3291. <:f200,QCourier New,>setit()<:f> built-in function.  When  you don't use 
  3292. <:f200,QCourier New,>setit()<:f> to set the pronouns yourself, the system will automatically set the pronouns to the direct object of the previous command.)  Before accepting the pronoun, the system uses the access-checking function (<:f200,QCourier New,>va
  3293. lidDo<:f> for a direct object, <:f200,QCourier New,>validIo<:f> for an indirect object) to ensure that the object is still accessible.
  3294. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>The special word for "all" is replaced with the object list returned by the 
  3295. <:f200,QCourier New,>doDefault<:f> property of the verb.  The parser calls 
  3296. <:f200,QCourier New,>doDefault<:f>, and includes all of the objects from the resulting list in the direct object list.  If a list of objects is excluded with "but" (for example:  "take everything except the key and the idol"), the parser removes the objects
  3297.  in the exception list from the <:f200,QCourier New,>doDefault<:f> list.
  3298. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Ordinary noun phrases require more analysis.  In particular, we must identify the actual objects to which the noun phrases refer.
  3299. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#3549,6624>First, we identify which objects are accessible.  To do this, the parser calls 
  3300. <:f200,QCourier New,>validDoList<:f> (or <:f200,QCourier New,>validIoList<:f>, as appropriate) in the 
  3301. <:f200,QCourier New,>deepverb<:f>.  This method is called with the actor, preposition, and other object as parameters; the preposition will be 
  3302. <:f200,QCourier New,>nil<:f> for one-object commands, and the other object may be 
  3303. <:f200,QCourier New,>nil<:f> if it's not known yet or isn't appropriate (when calling 
  3304. <:f200,QCourier New,>validDoList<:f> for a one-object command, the other object will always be 
  3305. <:f200,QCourier New,>nil<:f>).  This method returns either a list of objects, or 
  3306. <:f200,QCourier New,>nil<:f>; if it returns a list, this list is intersected with the list of objects that the parser found for the noun phrase, otherwise the entire noun phrase object list is retained.  Note that 
  3307. <:f200,QCourier New,>validDoList<:f> and <:f200,QCourier New,>validIoList<:f> must return every valid object, but they need not return 
  3308. <+">only<-"> valid objects--since the remaining objects will be checked for validity with 
  3309. <:f200,QCourier New,>validDo<:f> or <:f200,QCourier New,>validIo<:f>, 
  3310. <:f200,QCourier New,>validDoList<:f> and <:f200,QCourier New,>validIoList<:f> can harmlessly include invalid objects in their results.
  3311. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#3822,6624>Next, we call <:f200,QCourier New,>validDo<:f> (or <:f200,QCourier New,>validIo<:f>) in the 
  3312. <:f200,QCourier New,>deepverb<:f> for each surviving object.  The arguments to this method are the actor, the object whose validity is being tested, and a "sequence number."  The sequence number starts off at 1, and is incremented for each object in the lis
  3313. t.  The sequence number can be used when you wish to arbitrarily select a single object from a list of ambiguous objects--simply return 
  3314. <:f200,QCourier New,>true<:f> only for the first object, and <:f200,QCourier New,>nil<:f> for all of the other objects.  If this method returns 
  3315. <:f200,QCourier New,>true<:f>, it means that the object is valid for the current command--in other words, the object is accessible to the actor for the purposes of the command.  If the player wishes to take an object, for example, the object should be valid
  3316.  for the command if and only if the player can reach the object.  For other commands, accessibility may not necessitate that the object is reachable; for example, to look at an object, it need only be visible--if the object is inside a locked glass case, it
  3317.  will be visible but not reachable.   The parser eliminates from consideration any objects for which 
  3318. <:f200,QCourier New,>validDo<:f> (or <:f200,QCourier New,>validIo<:f>) returns 
  3319. <:f200,QCourier New,>nil<:f>.
  3320. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#3003,6624>We now check each surviving object to see if it's logical with the verb.  To do this, we make a "silent" call to the verification method.  Recall that the verb template we chose earlier specifies a pair certain methods--a verification method, and an action 
  3321. method--that we will call in the direct and indirect objects.  For example, the verb "take" may define a 
  3322. <:f200,QCourier New,>doAction = 'Take'<:f>, which means that the verification method for the direct object is 
  3323. <:f200,QCourier New,>verDoTake<:f>, and the action method is <:f200,QCourier New,>doTake<:f>.  The call is silent because we hide any messages that the method displays--the player will not be aware that we are making this call.  However, we 
  3324. <+">do<-"> take note of whether the method attempts to display any messages; if it does, the verification fails for the object.  We make a list of all of the objects that survived the validity test 
  3325. <+">and<-"> the verification test.
  3326. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>We now have two lists:  a list of <+">valid<-"> objects (objects which passed the validity test), and a list of 
  3327. <+">logical<-"> objects (objects which passed the verification test).
  3328. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#4095,6624>If both lists are empty, there's no way to apply the verb to the player's noun phrase--we can't identify any objects for which the command is valid.  We check to see if the player's noun phrase referred to any 
  3329. <+">visible<-"></`>objects; if not, we simply display message 9 ("I don't see any %s here", where the "%s" is replaced by the words from the player's noun phrase) and abandon the command.  Otherwise, we have a situation where the player referred to one or m
  3330. ore visible objects, but those objects can't be accessed for the purposes of this command.  In this case, we check to see if the verb object has a 
  3331. <:f200,QCourier New,>cantReach<:f> method--if so, we call the verb's 
  3332. <:f200,QCourier New,>cantReach<:f> method with four parameters:  the actor, a list of inaccessible direct objects, a list of inaccessible indirect objects, and the preposition.  Actually, only one of these lists will ever be supplied, and the other will alw
  3333. ays be <:f200,QCourier New,>nil<:f>; when the direct object is inaccessible, the first argument has the list of inaccessible (but visible) direct objects, and the second argument is 
  3334. <:f200,QCourier New,>nil<:f>.  When the indirect object is inaccessible, the arguments are reversed.  The preposition argument will be 
  3335. <:f200,QCourier New,>nil<:f> if the command is a one-object sentence.
  3336. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>For example, if a closed glass case contains a red book and a blue book, and the player types "take book," the word "book" will refer to the two books inside the case; neither of these books will be accessible for the "take" command, because they're inside 
  3337. a closed container, but they're both visible.  The parser will call the 
  3338. <:f200,QCourier New,>cantReach<:f> method defined in the verb:
  3339. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3340. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>takeVerb.cantReach(Me, <[>redBook blueBook],
  3341. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    nil, nil)<:f>
  3342. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3343. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>If the verb object doesn't define or inherit a <:f200,QCourier New,>cantReach<:f> method, the parser uses a different mechanism:  for each visible object, it calls the object's 
  3344. <:f200,QCourier New,>sdesc<:f> method, then displays message 200 (":"), then calls the 
  3345. <:f200,QCourier New,>cantReach<:f> method in the object itself--<+">not<-"></`>in the verb--with the actor as the single argument.
  3346. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>If the list of logical objects is empty, but the list of valid objects is not empty, the parser considers only the list of valid objects.  Otherwise, it considers only the list of logical objects.
  3347. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>At this point, the parser needs to determine whether the objects in the list are uniquely specified--in other words, it determines whether it has identified a single object for each singular noun phrase that the player entered.  If the player types "take bo
  3348. ok," the parser must find a <+">single object<-"></`>to which "book" refers.  Likewise, if the player types "take book and box," the parser must identify a single object for "book," and a single object for "box."
  3349. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>If any of the noun phrases were plural, they're now finished--the player explicitly asked us to use every object matching the phrase by using a plural.  For example, if the player types "take books," we will apply the command to every object which matches t
  3350. he vocabulary word "books" in its <:f200,QCourier New,>plural<:f> property.
  3351. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>Similarly, if a noun phrase was specified with "any," as in "take any book" or "drop any of the coins," the player has explicitly asked us to choose one of the objects matching the phrase.  The parser simply picks one of the remaining objects (it picks the 
  3352. first object in its internal list, but the order of objects in the internal list is unpredictable).
  3353. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2184,6624>In addition, if the objects themselves are all indistinguishable from one another, the parser also picks one of the objects arbitrarily.  Objects are indistinguishable if two conditions are true:  first, that the objects are all derived from the exactly the
  3354.  same class--that is, every object's immediate superclass is the same; and second, that the objects all have the property 
  3355. <:f200,QCourier New,>isEquivalent<:f> set to <:f200,QCourier New,>true<:f>.  If these two conditions hold, the parser considers the objects to be indistinguishable, and simply picks one from the list, exactly as though the user had used "any" with the noun 
  3356. phrase.
  3357. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#5187,6624>For a singular noun phrase, we must now have a single object.  If so, we're done with the object.  If more than one object remains, however, we have no way of knowing which of the remaining objects the player meant, so we must ask the player to tell us.  To
  3358.  do this, we check to see if the game program provides a function called 
  3359. <:f200,QCourier New,>parseDisambig<:f>.  If so, we call this function with two arguments:  a (single-quoted) string giving the text of the noun phrase that the player typed; and a list composed of the surviving objects.  If the game doesn't define a 
  3360. <:f200,QCourier New,>parseDisambig<:f> function, the parser generates a message:  it displays message 101 ("Which %s do you mean," with the "%s" replaced by the text entered by the player for the ambiguous noun phrase), then calls 
  3361. <:f200,QCourier New,>thedesc<:f> for each surviving object, then displays message 104 ("?").  Between adjacent objects, the parse displays message 102 (","); and it also displays message 103 ("or") after the second-to-last object.  Note one unusual case:  i
  3362. f the ambiguous list contains a set of objects that are mutually indistinguishable, as described earlier, the parser displays only one description for the whole set of such objects, and uses 
  3363. <:f200,QCourier New,>adesc<:f> instead of <:f200,QCourier New,>thedesc<:f> for the object.  For example, if the player types "take coin," and the room contains a gold coin and three silver coins which are all indistinguishable from one another, the message 
  3364. looks like this:  "Which coin do you mean, the gold coin, or a silver coin?"
  3365. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>Here's an example implementation of <:f200,QCourier New,>parseDisambig<:f>, which generates the same message that the parser would generate if 
  3366. <:f200,QCourier New,>parseDisambig<:f> weren't defined.
  3367. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3368. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>parseDisambig: function(str, lst)
  3369. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>{
  3370. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    local i, tot, cnt;
  3371. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    "Which <<<<str<;><;> do you mean, ";
  3372. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    for (i := 1, cnt := length(lst) ;
  3373. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>         i <<= cnt ; ++i)
  3374. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    {
  3375. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        lst<[>i].thedesc;
  3376. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        if (i << cnt) ", ";
  3377. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        if (i+1 = cnt) "or ";
  3378. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    }
  3379. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    "?";
  3380. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>}<:f>
  3381. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3382. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>After displaying prompting message, the parser lets the user enter a command using 
  3383. <:f200,QCourier New,>commandPrompt<:f> code 2.  If the player types something that looks like a noun phrase, the parser tries to use the new information to choose from the surviving objects.  If the player simply types "all" or "both," the parser chooses al
  3384. l of the surviving object.  If the player types "any," the parser chooses one of the surviving objects arbitrarily.  In either case, this completes disambiguation, since the parser has identified the objects the user wishes to use in the command.
  3385. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#3003,6624>If the player types adjectives and/or nouns, the parser limits the surviving list to objects that are associated with all of the new vocabulary words.  If no objects remain, the parser displays message 16 ("I don't see that here").  If exactly one object re
  3386. mains, disambiguation is complete, because the noun phrase has been resolved to a particular object.  Similarly, if the player typed a noun phrase that consists of multiple objects (for example:  "the red one and the blue one"), and the remaining list has t
  3387. he same number of objects as the number of noun phrases the player entered, disambiguation is completed.  Otherwise, the phrase is 
  3388. <+">still<-"> ambiguous, so the parser goes back and asks the user once again which of the remaining objects is to be used.  Note that if 
  3389. <:f200,QCourier New,>parseDisambig<:f> isn't defined, the parser displays message 100 ("Let's try it again:") before asking again.
  3390. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>If the player types something that doesn't look like a noun phrase, the parser abandons the current command, and starts over at the beginning, using the new input as the next command.
  3391. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3392. @Header@<:s><:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#370,6624>Command Execution:  Part Two
  3393. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3394. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>At this point, everything about the command is known.  The parser has converted the player's words into a set of objects, with each object having a specific function in the sentence.  Each component of the command--the actor, the verb, the direct object, th
  3395. e preposition, and the indirect object--has been resolved to an object or a list of objects.  We have also identified the verb template, which specifies the methods that are to be called in the objects at certain points during execution.  We now have all th
  3396. e information necessary to execute the command.
  3397. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3398. @Header@<:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#370,6624><:ZMultipleObjects><:Z~MultipleObjects>Processing Multiple Objects
  3399. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3400. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>A command can refer to multiple direct objects; for example, the player can type "take the ball and the box."  Fortunately, the details of handling multiple objects are entirely handled by the parser; you write the verb handlers in your game for single obje
  3401. cts only, and the parser calls these handlers as many times as necessary.
  3402. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#3549,6624>When the player uses multiple direct objects, either by listing several objects or by using "all," the parser checks to make sure the verb allows multiple direct objects.  (In certain cases, multiple objects will be disallowed before this point.  The parser
  3403.  never allows multiple indirect objects, and it doesn't allow multiple direct objects for verb templates that specify the 
  3404. <:f200,QCourier New,><[>disambigDobjFirst]<:f> flag.)  To determine if the verb allows multiple direct objects, the parser calls the 
  3405. <:f200,QCourier New,>rejectMultiDobj<:f> method in the <:f200,QCourier New,>deepverb<:f> object, passing  the preposition as the argument (the argument is 
  3406. <:f200,QCourier New,>nil<:f> for single-object commands).  If this method returns 
  3407. <:f200,QCourier New,>true<:f>, the parser terminates the command without further processing.  Note that the parser doesn't display anything if 
  3408. <:f200,QCourier New,>rejectMultiDobj<:f> returns <:f200,QCourier New,>true<:f>--the parser expects this method to display an appropriate error message if it returns 
  3409. <:f200,QCourier New,>true<:f>.  You can use <:f200,QCourier New,>rejectMultiDobj<:f> if you want to discourage the player from guessing for certain verbs.
  3410. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>The remainder of the processing for the command is done for each object in the direct object list.  The parser goes all the way through the rest of the command processing for the first direct object, then comes back to this step and goes through the same pr
  3411. ocess for the next direct object, and so on.
  3412. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2184,6624>Before proceeding, the parser displays the name of the current direct object if multiple direct objects are being used.  If only a single object is used in the command, the parser doesn't display the object name--this is only done for multiple objects, so t
  3413. hat the player can see the results of the command for each individual object.  Note that the parser displays the object name when "all" is used even if "all" ended up referring to only a single object, because the player didn't say exactly which object he o
  3414. r she meant.  For the same reason, we'll display the object name when the player used "any."
  3415. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>To display the object name, the parser first calls the <:f200,QCourier New,>multisdesc<:f> method in the current object (the parser calls 
  3416. <:f200,QCourier New,>sdesc<:f> instead if the object doesn't define or inherit 
  3417. <:f200,QCourier New,>multisdesc<:f>--this is for compatibility with games written with previous versions of TADS, since<:f200,QCourier New,> multisdesc<:f> is a recent addition); then, it displays message 120 (":").
  3418. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3419. @Header@<:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#370,6624>"Again"
  3420. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3421. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>Before going on, we check to see if the verb is "again," which requires special handling.  This verb is used to repeat the last command.  To identify this verb, TADS requires that you provide an object named 
  3422. <:f200,QCourier New,>againVerb<:f>--this allows you to define the vocabulary words that are to be used for this special internal command.  When the 
  3423. <:f200,QCourier New,>deepverb<:f> object for the command is <:f200,QCourier New,>againVerb<:f>, the parser knows to perform the special handling necessary to repeat the last command.
  3424. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2457,6624>If the player types "again" as the first command of the game, the parser displays message 26 ("There's no command to repeat"), and abandons the command.  Otherwise, the parser gets the information from the last command--the actor, verb, direct object, prepo
  3425. sition, and indirect object--and uses this as the new command information.  Before proceeding, the parser calls the 
  3426. <:f200,QCourier New,>validDo<:f> method in the <:f200,QCourier New,>deepverb<:f> to ensure that the direct object is still valid for the command, and calls 
  3427. <:f200,QCourier New,>validIo<:f> to ensure that the indirect object is still valid.  If either of these methods indicates that the objects are not valid, the parser displays message 27 ("You can't repeat that command") and terminates the command.
  3428. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>When the verb is something other than "again," the parser saves all of the information for the current command.  If the player uses "again" for the next command, it is this information that is used to repeat the command.  Note that this information is saved
  3429.  once for each object in a multi-object command, so if the player types "again" after typing "take the box and the ball," the command repeated is "take the ball."
  3430. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3431. @Header@<:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#370,6624>Checking with the Actor
  3432. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3433. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>The next step is to check to see if the actor will allow the command.  Every command is directed to an actor--if the player doesn't explicitly direct a command to an actor, it implicitly goes to the player actor, 
  3434. <:f200,QCourier New,>Me<:f>.  The parser calls the method <:f200,QCourier New,>actorAction<:f> in the actor object with four arguments:  the 
  3435. <:f200,QCourier New,>deepverb<:f> object, the current direct object, the preposition, and the indirect object.  For example, for the command "take the red book," the call would look like this:
  3436. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3437. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>Me.actorAction(takeVerb, redBook, nil, nil)<:f>
  3438. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3439. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#3003,6624>The <:f200,QCourier New,>actorAction<:f> method can either accept the command or disallow it.  To accept the command, the method need not do anything at all.  To reject the command, the method should use the 
  3440. <:f200,QCourier New,>exit<:f> or <:f200,QCourier New,>abort<:f> statement.  If you use the 
  3441. <:f200,QCourier New,>exit<:f> statement, you will disallow the command, but the turn will still be counted--that is, daemons and fuses will run as though the turn succeeded.  If you use 
  3442. <:f200,QCourier New,>abort<:f>, the turn doesn't count--the daemons and fuses will be skipped.  In most cases, you should use 
  3443. <:f200,QCourier New,>exit<:f> if you want to disallow the command in 
  3444. <:f200,QCourier New,>actorAction<:f>, because the attempt to command the actor should still count as a turn.  The 
  3445. <:f200,QCourier New,>abort<:f> statement is intended more for "system" commands, such as "save," that are intended to happen outside of the game's world, and so shouldn't count as turns within the game.
  3446. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>Note that the parser doesn't display any messages when <:f200,QCourier New,>actorAction<:f> uses 
  3447. <:f200,QCourier New,>exit<:f> or <:f200,QCourier New,>abort<:f> to disallow the command, so your 
  3448. <:f200,QCourier New,>actorAction<:f> method must display an appropriate error message before exiting or aborting.  Note also that this method has no return value.
  3449. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3450. @Header@<:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#370,6624>Checking with the Room
  3451. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3452. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>If the actor allows the command, the next step is to determine if the actor's current location allows the command.  To do this, the parser get the value of the 
  3453. <:f200,QCourier New,>location<:f> property from the actor (if this isn't an object, it skips this step), then calls the 
  3454. <:f200,QCourier New,>roomAction<:f> method in that object.  <:f200,QCourier New,>roomAction<:f> takes five arguments:  the actor, the verb, the direct object, the preposition, and the indirect object.  For example, if the player types "joe, put the ball in 
  3455. the box," the parser calls this:
  3456. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3457. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>joe.location.roomAction(joe, putVerb,
  3458. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>     redBall, inPrep, smallBox)<:f>
  3459. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>
  3460. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>As with <:f200,QCourier New,>actorAction<:f>, the <:f200,QCourier New,>roomAction<:f> method can disallow the command by using the 
  3461. <:f200,QCourier New,>exit<:f> statement.  This method must display a message if it disallows the command, because the parser will simply abandon the command if 
  3462. <:f200,QCourier New,>roomAction<:f> executes an <:f200,QCourier New,>exit<:f> statement.  This method has no return value.
  3463. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3464. @Header@<:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#370,6624><:ZVerbProcessing><:Z~VerbProcessing>General Verb Processing
  3465. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3466. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>The next step is to call a general-purpose method in the indirect object, and then in the direct object.  These general-purpose routines allow you to define certain behavior for an object for any verb from within a single method.  You will sometimes want an
  3467.  object to act a certain way for all (or nearly all) verbs; for example, if you want to create an object that's off in the distance, you will want to handle every verb except "inspect" the same way:  "That's too far away."  You can do this through the gener
  3468. al-purpose methods.
  3469. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>First, if the command has an indirect object, the parser calls the method 
  3470. <:f200,QCourier New,>iobjGen<:f> (indirect object general processing) in the indirect object.  This method takes four arguments:  the actor, the verb, the direct object, and the preposition.
  3471. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>Next, if the command has a direct object, the parser calls <:f200,QCourier New,>dobjGen<:f> in the direct object.  This method also takes four arguments:  the actor, the verb, the indirect object, and the preposition.
  3472. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>These methods, like <:f200,QCourier New,>roomAction<:f> and <:f200,QCourier New,>actorAction<:f>, can cancel the command by using the 
  3473. <:f200,QCourier New,>exit<:f> statement.  These methods should display an appropriate message if they do cancel the command, since the parser will simply abandon the command.
  3474. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>Note that the general-purpose handlers are <+">not<-"></`>called if the specific verb "overrides" them.  If the object defines--not inherits, but actually defines--either a verification method or an action method for the verb, the general-purpose method is 
  3475. <+">not<-"></`>executed.  These methods are intended to be "catch-all" methods; if a verification or action method for a particular verb is defined for the object, the parser assumes that the verb is 
  3476. <+">not<-"></`>to be handled by the catch-all method, so it skips calling the general-purpose routine.
  3477. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>Note that a verification or action method will "override" the general-purpose handler if it's defined in the same object as the general-purpose handler, or if it's defined in any subclass of the object that defines the general-purpose handler.  Consider thi
  3478. s example:
  3479. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3480. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>distantItem: fixeditem
  3481. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    dobjGen(a, v, iobj, p) =
  3482. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    {
  3483. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        "It's too far away!";
  3484. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        exit;
  3485. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    }<:f>
  3486. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    verDoInspect(actor) =
  3487. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    {
  3488. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        inherited.verDoInspect(actor);
  3489. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    }<:f>
  3490. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>;
  3491. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>
  3492. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>target<:f><:f200,QCourier New,>DistantItem: distantItem
  3493. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    verI<:f><:f200,QCourier New,>oThrowAt<:f><:f200,QCourier New,>(actor) =
  3494. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    {
  3495. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        inherited.verIoThrowAt(actor);
  3496. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    }
  3497. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>;<:f>
  3498. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>    
  3499. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>Now, any subclass of <:f200,QCourier New,>targetDistantItem<:f> will have 
  3500. <:f200,QCourier New,>verIoThrowAt<:f> override the presence of <:f200,QCourier New,>dobjGen<:f>.  Since 
  3501. <:f200,QCourier New,>verIoThrowAt<:f> overrides <:f200,QCourier New,>dobjGen<:f> in 
  3502. <:f200,QCourier New,>targetDistantItem<:f>, the same applies to any subclass.  The same is true of 
  3503. <:f200,QCourier New,>verDoInspect<:f>, because it overrides <:f200,QCourier New,>dobjGen<:f> by virtue of being defined in 
  3504. <:f200,QCourier New,>distantItem<:f> itself.
  3505. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>    
  3506. @Header@<:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#370,6624>Verification and Action
  3507. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3508. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>If the command survives all of the steps so far, the parser carries out the command on the objects involved.
  3509. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>The first step is to verify that the command is possible.  We have already determined that the objects involved in the command are accessible for the purposes of the command, but we don't know that the command can actually be applied to the object.  For exa
  3510. mple, if a door is already open, trying to "open the door" should fail.
  3511. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>Verification is done by calling the verification method, which is specified by the verb template as discussed earlier.  If there are no objects in the command, there is no verification step; we move on immediately to the action step.  Otherwise, we verify f
  3512. irst the direct object, then, if the command has one, the indirect object.
  3513. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3514. <:s><:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>Case 1:  No Objects<-!>
  3515. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>If the command has no objects, we simply call the <:f200,QCourier New,>action<:f> method defined in the 
  3516. <:f200,QCourier New,>deepverb<:f> object.  This method takes one argument:  the actor.  This method is responsible for carrying out the command; it should display an appropriate message--on either success or failure, since this is the entire command process
  3517. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>The <:f200,QCourier New,>action<:f> method has no return value.  It can use the 
  3518. <:f200,QCourier New,>exit<:f> statement to skip any remaining commands on the same line, and it can use 
  3519. <:f200,QCourier New,>abort<:f> to terminate the turn and skip running fuses and daemons.  Generally, you should only use 
  3520. <:f200,QCourier New,>abort<:f> with "system" commands that shouldn't count as turns.  System commands, such as "save" or "restart," happen outside of the game world, so they shouldn't consume any time within the game world.  For an ordinary command, even a 
  3521. failed command should usually count as a turn.
  3522. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>Note that the <:f200,QCourier New,>action<:f> method will generally use neither 
  3523. <:f200,QCourier New,>exit<:f> nor <:f200,QCourier New,>abort<:f>, even if the command fails.  You should only use these statements when you want to skip the remaining commands on the same line, which should only be done if something really important happens
  3524.  in the command--ordinary failures in an <:f200,QCourier New,>action<:f> routine don't usually warrant canceling the remainder of the command.
  3525. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>Another way of exiting an <:f200,QCourier New,>action<:f> routine is to use the 
  3526. <:f200,QCourier New,>askdo<:f> statement.  Executing an <:f200,QCourier New,>askdo<:f> statement lets you ask the player for a direct object, using exactly the same mechanism that the parser uses when it determines that a direct object is required--<:f200,QCourier New,>
  3527. askdo<:f> even supplies a default direct object using the same techniques as the parser.  See the description of default objects (page 
  3528. <:X3,-16384;PageRef DefaultObjects>70<:X~3,-16384;PageRef DefaultObjects>) details.
  3529. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>For example, when the player types "wait," the parser makes this call:
  3530. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3531. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>waitVerb.action(Me)<:f>
  3532. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3533. <:s><:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>Case 2:  Direct Object Only<-!>
  3534. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>If the command has one object, the parser starts by calling the verification method in the object.  The verification method, which is named 
  3535. <:f200,QCourier New,>verDo<:f><+">Verb <-">(where <+">Verb<-"> is replaced by the 
  3536. <:f200,QCourier New,>doAction<:f> property value--for example, for "take," the verification method is called 
  3537. <:f200,QCourier New,>verDoTake<:f>), takes one parameter:  the actor.
  3538. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#3549,6624>If the verification method is not defined or inherited for the object, the parser disallows the command and displays an error.  To display the error, the parser checks to see if the game defines a function called 
  3539. <:f200,QCourier New,>parseError2<:f>.  If so, it calls this function with four parameters:  the verb, the direct object, the preposition, and the indirect object (note that the preposition and indirect object may be 
  3540. <:f200,QCourier New,>nil<:f>); this routine is responsible for displaying an appropriate message.  If this function isn't defined, the parser generates a message:  it displays message 110 ("I don't know how to"), then calls the 
  3541. <:f200,QCourier New,>sdesc<:f> method in the <:f200,QCourier New,>deepverb<:f> object.  Then, if there's only a direct object, it displays message 111 (a space), then calls the 
  3542. <:f200,QCourier New,>thedesc<:f> method in the direct object; if there's an indirect object, the parser displays message 112 ("anything"), then calls 
  3543. <:f200,QCourier New,>sdesc<:f> in the preposition object (or displays message 113 ("to") if there's no preposition), then displays message 114 (a space), then calls 
  3544. <:f200,QCourier New,>thedesc<:f> in the indirect object.
  3545. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Here's an example implementation of <:f200,QCourier New,>parseError2<:f>, which generates the same message that the parser would use if 
  3546. <:f200,QCourier New,>parseError2<:f> were not defined.
  3547. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3548. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>parseError2:  function(v, d, p, i)
  3549. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>{
  3550. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    "I don't know to how <<<<v.sdesc<;><;> ";
  3551. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    if (d)
  3552. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        "<<<<d.thedesc<;><;>.";
  3553. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    else
  3554. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        "anything <<<<p ? p.sdesc : "to"
  3555. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        <;><;> <<<<i.thedesc<;><;>.";
  3556. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>}<:f>
  3557. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3558. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>Apart from this extra message, the absence of a defined or inherited verification method is equivalent to the verification method failing by displaying a message.
  3559. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>If the verification method displays a message, the command is terminated; the parser proceeds with the next direct object in the same command, or moves on to the next command on the command line.  The verification method doesn't have a return value--it indi
  3560. cates failure by displaying a message, and indicates success by displaying nothing.
  3561. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2184,6624>Note that verification methods must <+">not<-"></`>make any changes to game state--they must never set the object of a property, or call any built-in functions with side effects (for example, never call 
  3562. <:f200,QCourier New,>restart<:f> or <:f200,QCourier New,>askfile<:f> from within a verification method).  Verification methods can be called "silently," which means that the parser hides any messages they generate from the player--see the section on resolvi
  3563. ng objects (page <:X3,-16384;PageRef ObjectResolution>94<:X~3,-16384;PageRef ObjectResolution>) for details.  The parser is simply testing various possibilities when making these silent calls, and hasn't committed to a course of action yet, so these calls m
  3564. ust not have any effect on the game state.
  3565. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>If the verification test succeeds--in other words, the verification method doesn't display any messages--the parser calls the action method in the direct object.  The action method is named 
  3566. <:f200,QCourier New,>do<+"><:f>Verb<-"> (for example, the action method for "take" is called 
  3567. <:f200,QCourier New,>doTake<:f>).  Note that the <:f200,QCourier New,>do<:f> in 
  3568. <:f200,QCourier New,>doTake<:f> stands for "direct object"--it's not the word "do."  The action method is called with one parameter:  the actor.
  3569. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>The action method is responsible for carrying out the command.  It should display an appropriate message--both on success and on failure, because this is the entire processing of the command.
  3570. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>Note that it's possible for the action method to reject the command, even though the verification method allowed it.  If the action method wants to apply a tougher standard to the conditions under which the command can succeed, it can do so without any prob
  3571. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>For example, when the player types "take red book," the parser calls these methods:
  3572. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3573. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>redBook.verDoTake(Me)
  3574. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>redBook.doTake(Me)<:f>
  3575. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3576. <:s><:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>Case 3:  Direct and Indirect Objects<-!>
  3577. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>When both a direct and an indirect object are specified, the verification sequence involves 
  3578. <+">both<-"></`>objects.  First, the parser checks to make sure that the verification methods are defined or inherited for both objects; if not, the command fails, and the parser displays a message as described above for Case 2.
  3579. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>The parser first verifies the direct object.  It does this by calling 
  3580. <:f200,QCourier New,>verDo<+"><:f>Verb<-"> in the direct object.  For a normal verb, whose the verb template does 
  3581. <+">not <-">define the <:f200,QCourier New,><[>disambigDobjFirst]<:f> flag, this method takes two parameters:  the actor, and the indirect object.  Otherwise, the only parameter is the actor.
  3582. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,>If the direct object verification is successful, we verify the indirect object by calling 
  3583. <:f200,QCourier New,>verIo<+"><:f>Verb<-"> in the indirect object.  For a normal verb, whose template does not specify 
  3584. <:f200,QCourier New,><[>disambigDobjFirst]<:f>, this method takes only one parameter:  the actor.  For verb templates that 
  3585. <+">do<-"> specify the <:f200,QCourier New,><[>disambigDobjFirst]<:f> flag, this method takes two parameters:  the actor, and the direct object.
  3586. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>If either verification method displays a message, the command fails, and we proceed to the next direct object of the current command, or to the next command on the command line if there are no more direct objects for the current command.
  3587. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>If both verification methods succeed, we call the action method for the verb template.  The action method for a two-object command is 
  3588. <+">always<-"> called in the <+">indirect<-"> object.  The method is called 
  3589. <:f200,QCourier New,>io<+"><:f>Verb<-">, and takes two parameters:  the actor, and the direct object.  (Note that the direct object is always included in this call, regardless of any special flags in the verb template.)  As with a single-object action metho
  3590. d, this action method is responsible for carrying out the command, and must display an appropriate message, whatever the outcome of the command.
  3591. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>Note that the parser will <+">not<-"></`>call any action method in the direct object for a two-object command.  Your action method in the indirect object is free to call a method in the direct object if you wish to have a direct object method process the co
  3592. mmand, but the parser will never call such a method directly.
  3593. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>For example, if the player types "put ball in box," the parser makes these calls:
  3594. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3595. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>ball.verDoPutIn(Me, box)
  3596. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>box.verIoPutIn(Me)
  3597. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>box.ioPutIn(Me, ball)<:f>
  3598. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>
  3599. @Header@<:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#370,6624>Daemons and Fuses
  3600. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3601. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>After processing the verification and action methods, the command is finished.  The parser goes back and processes the next direct object in the same command, as described earlier.  The steps above are repeated for each direct object in the list.
  3602. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>Once all of the direct objects have been processed for a particular command, the turn is over.  Even if the command line has additional commands following the current command, the parser considers the current command to be a complete turn--the additional co
  3603. mmands will be processed, but will be counted as additional turns.  So, once all of the direct objects have been processed for a command, the parser executes the daemons and fuses.
  3604. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>The parser first executes the daemons.  The order in which the daemons are executed is arbitrary; it depends on the (unpredictable) order in which the system builds its internal lists as daemons are added and removed.  The parser executes all active daemons
  3605.  set with the <:f200,QCourier New,>setdaemon()<:f> built-in function, then executes all active daemons set with the 
  3606. <:f200,QCourier New,>notify()<:f> built-in function.
  3607. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>Next, the parser executes any active fuses that has "burned down."  As with daemons, the order in which fuses are executed is arbitrary and unpredictable.  The system first executes any fuses set with the 
  3608. <:f200,QCourier New,>setfuse()<:f> function, then executes any fuses set with the 
  3609. <:f200,QCourier New,>notify()<:f> function.  Before executing each fuse, the parser removes it from the list of active fuses.  Only fuses that have burned down are executed; others are left to be processed when they're ready.
  3610. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>Note that the fuse timer is entirely under the control of your game program.  The only time that fuse timers are advanced is when you call the 
  3611. <:f200,QCourier New,>incturn()<:f> built-in function.  This function advances all fuse timers by one turn (or by a specified number of turns, if you provide an argument), and marks any fuses that burn down as being ready for execution.  The 
  3612. <:f200,QCourier New,>incturn()<:f> function doesn't actually execute any fuses, but merely advances their timers.
  3613. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3614. @Header@<:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#370,6624><:ZVerbSynonyms><:Z~VerbSynonyms>Verb Synonyms and Verb Redirection
  3615. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3616. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>TADS has a couple of convenience features that make it easy to create certain common definitions.
  3617. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2730,6624>First, TADS lets you define object-level verb synonyms.  It's often desirable to make a number of verbs work the same way with a particular object, because different users will try to do the same thing with slightly different commands.  For example, if you 
  3618. have a touch-pad on a control panel in  your game, the player may try a number of different verbs with it:  touch, push, tap, press.  "Push" and "press" are already synonymous in adv.t (they both refer to 
  3619. <:f200,QCourier New,>pushVerb<:f>), but "touch" is a separate verb, and "tap" isn't even defined, so you would have to add this verb in your game program.  Since "touch" and "tap" are separate verbs from "push," you will need to make the touch pad object re
  3620. spond to all three verification methods and all three action methods the same way.  You 
  3621. <+">could<-"></`>do this with code like this:
  3622. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3623. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>verDoPush(actor) = { self.verDoTouch(actor); }
  3624. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>doPush(actor) = { self.doTouch(actor); }<:f>
  3625. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3626. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>This is tedious, though--especially if you have more than two or three verbs that you want to make synonymous.  Instead of these lengthy definitions, you can use the TADS object-level verb synonym feature.  To do this, you use the special pseudo-property 
  3627. <:f200,QCourier New,>doSynonym<:f>:
  3628. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3629. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>doSynonym('Touch') = 'Push'<:f>
  3630. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3631. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>This simple definition has the same effect as the much lengthier definitions above.  The way to read this definition is:  the direct-object verb synonym for "touch" is "push."
  3632. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>You can specify that more than one verb is a synonym for another verb.  To do this, simply list all of the different verb synonyms on the right-hand side of the equals sign:
  3633. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3634. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>doSynonym('Touch') = 'Push' 'Tap'<:f>
  3635. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>
  3636. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>Read this definition as:  the direct-object verb synonyms for "touch" are "push" and "tap."  Note that the fact that you can use multiple verbs on the right-hand side may make it easier to remember which way this direction works.  All of the verbs in the co
  3637. mmand are redirected to a single verb, so the "target"--the verb handler that's actually called when any of these verbs are used--must be in the position where only one verb can go, which is inside the parentheses.  So, if the player types "push pad," the p
  3638. arser will call <:f200,QCourier New,>verDoTouch<:f> and <:f200,QCourier New,>doTouch<:f>.
  3639. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624><:f200,QCourier New,>ioSynonym<:f> works the same way, but maps the 
  3640. <:f200,QCourier New,>verIo<+"><:f>Verb<-"> and <:f200,QCourier New,>io<+"><:f>Verb<-"> handlers of one or more verbs to those of another verb.  Whereas 
  3641. <:f200,QCourier New,>doSynonym<:f> makes one or more verbs synonymous when the object is used as a direct object, 
  3642. <:f200,QCourier New,>ioSynonym<:f> makes verbs synonymous when the object is used as an indirect object.
  3643. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>Note that verb synonyms created with <:f200,QCourier New,>doSynonym<:f> and 
  3644. <:f200,QCourier New,>ioSynonym<:f> apply only to the object in which they are defined.  A verb synonym created for one object doesn't affect any other objects, so "touch" and "push" are still separate verbs for other objects.  Of course, verb synonyms are i
  3645. nherited just like any other verb handler.
  3646. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>The second convenience feature lets you specify that when a verb is applied to a particular object, it should instead be applied to a different object.  This is often convenient when you are composing a complex object in your game from several internal obje
  3647. cts.  For example, you might want to include a desk with a drawer.  The desk and drawer are separate objects, but the player may type "open desk" to open the drawer.  You could code this by redirecting the verb verification and action methods for "open" fro
  3648. m the desk to the drawer:
  3649. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3650. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>desk:  fixeditem
  3651. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    noun = 'desk'
  3652. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    sdesc = "desk"
  3653. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    location = office
  3654. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    verDoOpen(actor) =
  3655. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    {
  3656. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        deskDrawer.verDoOpen(actor);
  3657. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    }
  3658. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    doOpen(actor) =
  3659. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    {
  3660. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        deskDrawer.doOpen(actor);
  3661. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    }
  3662. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>;<:f>
  3663. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3664. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>This works, but redirecting more verbs would be tedious--and you'd probably want to redirect at least "close," and probably "look in" and "put in" as well.  To avoid the large amount of typing this would involve, you can use the verb handler redirection syn
  3665. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3666. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>doOpen -<;> deskDrawer<:f>
  3667. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3668. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>(Note that the symbol "<:f200,QCourier New,>-<;><:f>" is made up of a hyphen followed by a greater-than sign.)  This single line replaces the 
  3669. <:f200,QCourier New,>verDoOpen<:f> and <:f200,QCourier New,>doOpen<:f> definitions above.  It indicates that both the 
  3670. <:f200,QCourier New,>doOpen<:f> and <:f200,QCourier New,>verDoOpen<:f> methods, when called on the desk, should be redirected to the drawer.
  3671. <:s><:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3672. @Header@<:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#370,6624>Format Strings
  3673. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3674. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>For the most part, TADS doesn't treat the player actor's object, <:f200,QCourier New,>Me<:f>, any differently from any other actor in the game.  When the player types a command that isn't explicitly directed to another actor, TADS assumes that the actor is 
  3675. <:f200,QCourier New,>Me<:f>, and from that point on acts the same as it would if the command were being directed to any other actor.
  3676. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>All of the command handling methods that the parser calls have the current actor object as a parameter, which allows them to be written independently of actor--or, if desired, to take special actions for certain actors.  The verb handlers in adv.t generally
  3677.  treat all actors the same.  For example, the definition of <:f200,QCourier New,>doTake<:f> in the class 
  3678. <:f200,QCourier New,>thing<:f> doesn't move the object being taken into the player's inventory, but rather into the current actor's inventory.  This allows commands such as "take the box" and "joe, take the box" to be processed using the same code.
  3679. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>If a command handler is written independently of the actor, it needs to be able to display its messages in terms of the actor carrying out the command, rather than simply in terms of "you."  It would be very inconvenient if you had to call 
  3680. <:f200,QCourier New,>actor.thedesc<:f> every time you wrote a message in a verb handler, so TADS provides a much more convenient mechanism called "format strings."
  3681. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>A format string is a special sequence of characters that signals the output formatter to substitute a property of the current command's actor.  Instead of using "you" and related words, the messages in adv.t use format strings; your game program should do t
  3682. he same thing any place where an actor other than the player may be taking some action that results in a message.
  3683. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>A format string associates a special character sequence with a property name.  When a message includes a format string, enclosed in percent signs (%), the output formatter removes the format string and replaces it by calling the property associated with the
  3684.  format string.  For example, one of the format strings defined in adv.t is:
  3685. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3686. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>formatstring 'you' fmtYou;<:f>
  3687. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3688. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>This tells the system that whenever it sees "%you%" in a message being displayed, it removes the "%you%" sequence, and replaces it with the text that results from evaluating the property 
  3689. <:f200,QCourier New,>fmtYou<:f> in the current actor.
  3690. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>You can define new format strings of  your own, although adv.t defines most of the format strings you'll probably need.
  3691. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>In adv.t, most messages are phrased in terms of format strings.  For example, when the player tries to travel a particular direction but can't, adv.t doesn't display "You can't go that way," but instead displays "%You% can't go that way."  When the player t
  3692. ries to go east but can't, the system displays "You can't go that way," just as it would have if the format string hadn't been used.  But, when the player types "joe, go east," the system displays "Joe can't go that way," because 
  3693. <:f200,QCourier New,>joe.fmtYou<:f> displays "joe" rather than "you."
  3694. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>Note that the capitalization of the replacement text follows the capitalization of the format string itself.  So, "%you%" becomes "you," while "%You%" becomes "You."  ("Joe" is displayed capitalized in either case if the message displayed by 
  3695. <:f200,QCourier New,>joe.fmtYou<:f> is itself capitalized.)
  3696. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>Note that many format strings are defined for other parts of the sentence.  When writing a message, you will usually have to use several format strings to keep the sentence grammatical.  For example:
  3697. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3698. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>"%You% %are%n't wearing %your% spacesuit."
  3699. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3700. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>This message will become "You aren't wearing your spacesuit" when displayed for the player character, but will become "Joe isn't wearing his spacesuit" when displayed for Joe.
  3701. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3702. @Header@<:s><:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#370,6624>Compound Words
  3703. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3704. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>TADS can only handle prepositions that consist of a single word.  Unfortunately, English and other human languages have constructions in which multiple words are used for the function of a single preposition in a sentence; for example, "take the book out of
  3705.  the bag" has two prepositions in a row, "out of," serving the function of a preposition in the sentence.
  3706. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>Although TADS doesn't have any way to specify a sentence template that uses multiple prepositions like this, it 
  3707. <+">does<-"></`>provide a mechanism that lets you specify that certain pairs of words are "glued together" into a single word when they occur together.  In the example above, you could define "out of" as such a pair of words:  whenever the parser sees "out"
  3708.  followed directly by "of," it can be made to put these two words together and treat the pair as a single word.
  3709. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>To define a pair of words that should be treated as a single word, you use the 
  3710. <:f200,QCourier New,>compoundWord<:f> statement.  For example:
  3711. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3712. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>compoundWord 'out' 'of' 'outof';<:f>
  3713. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3714. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>This specifies that when the parser sees the word "out," followed directly by the word "of," it should take the pair of words and replace it with the single word "outof."  (Note this replacement word follows the convention in adv.t, which is to simply conca
  3715. tenate the two words to form the replacement word, but the replacement can be anything at all--you could have made the replacement word, for example, "out_of.")
  3716. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>Note that you must still define "outof" as a preposition.  Even though "out" and "of" are separately defined as prepositions, the result of a compound word replacement must 
  3717. <+">also<-"></`>be defined as a vocabulary word.  Once the pair of words is replaced with the compound word, the parser forgets ever knowing about the pair as separate words.
  3718. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>You can't directly define three-word (or longer) compound words, but you can 
  3719. <+">indirectly<-"></`>do so by constructing the longer words from two-word directives.  For example, to convert "out from under" into a single preposition, you would use two compound word definitions:
  3720. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3721. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>compoundWord 'out' 'from' 'outfrom';
  3722. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>compoundWord 'outfrom' 'under' 'outfromunder';<:f>
  3723. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3724. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>When the parser finds the sequence "out from under," it first converts "out from" into "outfrom."  Then, it checks the sentence again, and finds the pair "outfrom under," which is converts to "outfromunder."
  3725. <:s><:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3726. @Header@<:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#370,6624>Special Words
  3727. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3728. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>The parser treats a number of words as special reserved words.  These words aren't ordinary vocabulary words, because they don't fit in to the parts of speech used for normal vocabulary words--they aren't nouns, plurals, adjectives, articles, verbs, or prep
  3729. ositions.  Since they aren't ordinary vocabulary words, you can't define them using the normal vocabulary definitions; instead, you use a separate command to specify these words:  the 
  3730. <:f200,QCourier New,>specialWords<:f> statement.
  3731. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2184,6624>This command can appear anywhere that one of the other special commands (such as 
  3732. <:f200,QCourier New,>formatstring<:f> or <:f200,QCourier New,>compoundWord<:f>) is allowed.  Following the 
  3733. <:f200,QCourier New,>specialWords<:f> keyword, you list all of the special words in a fixed order.  You must specify the words in the order shown below, and you  must provide at least one word for every position.  You can provide more than one word for each
  3734.  position, by listing each synonym separated by an equals sign (=).  The default list, which matches the built-in list if no 
  3735. <:f200,QCourier New,>specialWords<:f> command is used in your game, looks like this:
  3736. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3737. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>specialWords
  3738. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    'of',
  3739. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    'and',
  3740. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    'then',
  3741. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    'all' = 'everything',
  3742. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    'both',
  3743. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    'but' = 'except',
  3744. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    'one',
  3745. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    'ones',
  3746. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    'it',
  3747. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    'them',
  3748. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    'him',
  3749. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    'her',
  3750. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    'any' = 'either'
  3751. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>;<:f>
  3752. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3753. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>Except for the words in the "of," "one," and "ones" positions, the words specified in the list can't be used as ordinary vocabulary words at all--they're always considered to have their special meaning as listed here.  The slots for "of," "one," and "ones" 
  3754. are <+">not<-"></`>reserved in ordinary use; their special meanings are in effect only when the parser expects them according to context.
  3755. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>Note that the slot occupied by "any" is a recent addition.  You can omit this position in a 
  3756. <:f200,QCourier New,>specialWords<:f>, in which case the system will use the default ("any" and "either" will be used as synonyms for this position).
  3757. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#3276,6624>You can use the special <:f200,QCourier New,>replace<:f> and <:f200,QCourier New,>modify<:f> commands with 
  3758. <:f200,QCourier New,>specialWords<:f>.   If your statement starts off with 
  3759. <:f200,QCourier New,>replace specialWords<:f>, any previous special words definitions are discarded, and the new set is used.  (Note that the same thing happens if you specify a second 
  3760. <:f200,QCourier New,>specialWords<:f> directive in your game program with neither a 
  3761. <:f200,QCourier New,>replace<:f> nor <:f200,QCourier New,>modify<:f> prefix, but the compiler will warn you that you should use 
  3762. <:f200,QCourier New,>replace<:f> to make your intentions explicit.)  If your statement starts off with 
  3763. <:f200,QCourier New,>modify specialWords<:f>, the compiler <+">adds<-"></`>the special words in the new list to the words that have already been defined in previous 
  3764. <:f200,QCourier New,>specialWords<:f> statements.  When using <:f200,QCourier New,>modify<:f>, you can use 
  3765. <:f200,QCourier New,>nil<:f> in any slot to indicate that you don't wish to add any words to that position.  You can therefore use 
  3766. <:f200,QCourier New,>modify<:f> as a means of adding a new special word or words to one or more slots, without having to specify the entire list again.
  3767. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3768. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3769. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3770. @Header@<:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#370,6624><:ZParseError><:Z~ParseError>Error Messages
  3771. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3772. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>When an error occurs during parsing, the parser tells the user what went wrong with as specific an error message as possible. One of the design goals of the parser is to be friendly to players; although error messages are inherently somewhat unfriendly, the
  3773. y certainly can't be eliminated entirely, so we at least try to make them informative. The player should always be able to understand why the game rejects a command, so that he or she can figure out what to say instead.
  3774. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>The parser lets your game program provide a custom message for every error. Most errors are handled through the function 
  3775. <:f200,QCourier New,>parseError<:f>--if your game defines this function, the parser will call it whenever it wants to display an error. A few parser messages are more specialized, and use different functions that you can optionally provide.
  3776. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>The parser calls the <:f200,QCourier New,>parseError<:f> function with two parameters:  a message number, and the text of the default message. The message number identifies the reason the parser is displaying a message--each situation that requires a messag
  3777. e is given its own message number. The default message is the text that the parser would have displayed if you did not define a 
  3778. <:f200,QCourier New,>parseError<:f> function in your game at all.
  3779. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>You may have noticed references to message numbers elsewhere in this chapter--these were referring to 
  3780. <:f200,QCourier New,>parseError<:f> message numbers.
  3781. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>Your <:f200,QCourier New,>parseError<:f> function should return either 
  3782. <:f200,QCourier New,>nil<:f> or a (single-quoted) string value. If your 
  3783. <:f200,QCourier New,>parseError<:f> function returns <:f200,QCourier New,>nil<:f>,  it means that you want to use the default message--this is the same as not defining a 
  3784. <:f200,QCourier New,>parseError<:f> function at all. If your function returns a string value, the string is displayed in place of the parser's default message.
  3785. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>Note that a few of the default messages contain the sequence "%s". This special sequence is replaced in the actual message displayed by a string value of some sort; for example, in message 2, the "%s" is replaced with the unknown word. Similarly, the specia
  3786. l sequence "%c" in message is replaced with a single character, and "%d" is replaced by a number.  You can use a "%" sequence in any message you provide to replace a message where the default text uses the same special sequence.
  3787. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2184,6624>Messages with numbers below 100 are complete messages--they're not part of more complex messages built out of pieces.  Messages 100 and above are different:  they're fragments of complete messages; several such fragments are combined (sometimes with other t
  3788. ext as well) to form a complete message.  So, if you want to do some special formatting, such as enclosing any parser error messages in parentheses, you can easily do so for any of the regular messages, and avoid doing so for the complex messages, you can s
  3789. imply check the message number to make sure it's less than 100, and apply your special formatting if so.
  3790. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624> Most of the messages in the first group are self-explanatory, although a few require some explanation.
  3791. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1911,6624>Messages 3, 10, and 11 are generated if a word the player uses refers to more than a fixed number of objects in the game. Note that the limit applies regardless of whether the objects are all present or not--the limit is for the total number of objects in t
  3792. he entire game with the same vocabulary word. (For this reason, it's probably not a good idea to define a noun or adjective in a very general class such as "thing" or "item".)  The limit in version 2.2 is 200 objects; prior to 2.2 it was 100 objects.
  3793. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1638,6624>Message 9 is generated if the words the player uses to refer to an object are not all defined for at least one object. For example, if your game has a blue book, and a red box, the words "red" and "blue" will both be recognized as adjectives, and "book" and
  3794.  "box" as nouns; if the player types "look at red book," the phrase "red book" will be recognized as a valid noun phrase in form, but it doesn't refer to any object defined in the game. The parser will respond with message 9.
  3795. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>Messages 13 and 14 are used for pronouns. When the player refers to one of the singular pronouns (it, her, and him), and the object that the pronoun represents is no longer accessible, message 13 is used. Message 14 is used with the pronoun "them."
  3796. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Message 15 is used when the player uses "all" as the object of a command, but there are no suitable objects present.
  3797. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>Message 28 is displayed when the player enters a command with multiple direct objects for a verb that requires the direct object to be disambiguated first. Verbs that process the direct object first accept only one direct object.
  3798. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Message 30 is displayed when the player enters a command like "take 3 balls," but fewer such items are present.
  3799. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>When the player addresses a command to an actor, and the actor is visible to the player (the actor's 
  3800. <:f200,QCourier New,>isVisible(Me)<:f> returns <:f200,QCourier New,>true<:f>), but the actor is not a valid actor (the actor's 
  3801. <:f200,QCourier New,>validActor<:f> method returns <:f200,QCourier New,>nil<:f>), the parser displays message 31.
  3802. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3803. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>1    I don't understand the punctuation "%c".
  3804. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>2    I don't know the word "%s".
  3805. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>3    The word "%s" refers to too many objects.
  3806. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>4    I think you left something out after "all of".
  3807. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>5    There's something missing after "both of".
  3808. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>6    I expected a noun after "of".
  3809. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>7    An article must be followed by a noun.
  3810. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>8    You used "of" too many times.
  3811. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>    <+">Note:  message 8 is no longer used.<-">
  3812. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>9    I don't see any %s here.
  3813. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>10    You're referring to too many objects with "%s".
  3814. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>11    You're referring to too many objects.
  3815. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>12    You can only speak to one person at a time.
  3816. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>13    I don't know what you're referring to with '%s'.
  3817. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>14    I don't know what you're referring to.
  3818. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>15    I don't see what you're referring to.
  3819. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>16    I don't see that here.
  3820. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>17    There's no verb in that sentence!
  3821. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>18    I don't understand that sentence.
  3822. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>19    There are words are your command I couldn't use.
  3823. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>20    I don't know how to use the word "%s" like that.
  3824. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>21    There appear to be extra words after your command.
  3825. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>22    There seem to be extra words in your command.
  3826. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>23    internal error:  verb has no action, doAction, or ioAction
  3827. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>24    I don't recognize that sentence.
  3828. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>25    You can't use multiple indirect objects.
  3829. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>26    There's no command to repeat.
  3830. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>27    You can't repeat that command.
  3831. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>28    You can't use multiple objects with this command.
  3832. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>29    I think you left something out after "any of".
  3833. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>30    I only see %d of those.
  3834. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>31    You can't talk to that.
  3835. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>32    Internal game error:  preparseCmd returned an invalid list
  3836. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>33    Internal game error:  preparseCmd command too long
  3837. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>34    Internal game error:  preparseCmd loop
  3838. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3839. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>The next set of messages is used to ask questions when the player refers to an object with words that could refer to more than one object. The parser must in these cases ask the player which of the possible objects was meant. Note that these messages will o
  3840. nly be used if your game does not define a <:f200,QCourier New,>parseDisambig<:f> function, which will be used instead if defined.
  3841. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3842. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>100    Let's try it again:
  3843. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>101    Which %s do you mean,
  3844. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>102    ,
  3845. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>103    or
  3846. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>104    ?
  3847. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3848. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>The next set is used when an object is not suitable for a verb. These messages are needed when a player uses a verb with an object, but the object does not define (or inherit from a superclass) an appropriate "verification" method (verDo<+">Verb<-"> or verI
  3849. o<+">Verb<-">). Messages 111 and 114 consist of a single space.
  3850. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Note that these messages are not used if your game defines a <:f200,QCourier New,>parseError2<:f> function, since that function will be called instead to display this error.
  3851. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3852. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>110    I don't know how to
  3853. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>111    
  3854. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>112    anything
  3855. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>113    to
  3856. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>114
  3857. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>116    .
  3858. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3859. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>The next message is used after each object when multiple objects are listed. For example, when the player enters the command "take all," the parser will apply the verb "take" to each accessible object in sequence; before applying the verb to each object, th
  3860. e parser displays the name of the object, followed by this message, so that the player can see the results of the command for each object.
  3861. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3862. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>120    :
  3863. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3864. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#2730,6624>The next messages are used to note objects being used by default. When the player types a command that omits an object, and the parser can determine that the verb implies that a particular object is being used, the parser will display the name of the object
  3865.  with these messages. For example, if the player types "dig", the parser might determine that the direct object is implicitly the ground, the preposition is "with," and the indirect object is implicitly the shovel; in this case, it will display message 130,
  3866.  then the name of the ground, then message 131; then it will display message 130 again, then the name of the assumed preposition, then message 132, then the name of the shovel, then message 131. Message 132 consists of a single space.
  3867. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Note that these messages won't be used if your game defines a <:f200,QCourier New,>parseDefault<:f> function.
  3868. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3869. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>130    (
  3870. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>131    )
  3871. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>132
  3872. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3873. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624>When the player leaves out the object in a command, but the parser is 
  3874. <+">not<-"></`>able to find a suitable default object, the parser will ask the player to supply an object using these messages.
  3875. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624>Note that these messages aren't used if your game defines a <:f200,QCourier New,>parseAskobj<:f> or 
  3876. <:f200,QCourier New,>parseAskobjActor<:f> function.
  3877. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3878. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>140    What do you want to
  3879. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>141    it
  3880. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>142    to
  3881. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>143    ?
  3882. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>144    them
  3883. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>145    him
  3884. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>146    her
  3885. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>147    them
  3886. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>148    What do you want
  3887. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>149    to
  3888. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3889. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624>When the player uses words that could refer to more than one object, and the objects in question are visible but not accessible, the parser will call the 
  3890. <:f200,QCourier New,>cantReach<:f> method in each of the objects after displaying the name of the object and message 200.
  3891. <:s><:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3892. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>200    :
  3893. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3894. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>Here's a sample of a <:f200,QCourier New,>parseError<:f> function that encloses any of the regular messages in square brackets.  It ignores any messages that aren't in the simple message range (below 100), since messages outside this range are fragments of 
  3895. more complicated messages, so can't be formatted as though they were entire messages.
  3896. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3897. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>
  3898. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>parseError: function(str, num)
  3899. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>{
  3900. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    if (num << 100)
  3901. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        return '<[>' + str + ']';
  3902. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>    else
  3903. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>        return nil;
  3904. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f200,QCourier New,>}<:f>
  3905. <:I0,360,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3906. @Header@<:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#370,6624>Summary of Properties, Methods, Objects, and Functions
  3907. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3908. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624>As described throughout this chapter, the parser calls certain methods that objects in your game can define, and calls certain functions that your game can provide.  All of these methods and functions are described in detail in this chapter.  This section s
  3909. ummarizes these properties and function; for full information, refer to the appropriate section earlier in this chapter.
  3910. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3911. <:I0,0,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f240,2MinioMMSC_367 RG 585 NO 11 OP,><+!>Properties and Methods<-!><:f>
  3912. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624><+!>action(<+">actor<-">)<-!>:  Called in a <:f200,QCourier New,>deepverb<:f> object during command execution to execute a command with no objects.
  3913. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624><+!>actorAction(<+">verb, dobj, prep, iobj<-">)<-!>:  Called in the actor object during command execution.
  3914. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>adesc<-!>:  Used to display an object's short description with an indefinite article.
  3915. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>adjective<-!>:  Defines words as adjectives, and associates them with the object.
  3916. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>article<-!>:  Defines words as articles.
  3917. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624><+!>cantReach(<+">actor<-">)<-!>:  Called in an object (only if <:f200,QCourier New,>cantReach<-"><-"><:f> isn't defined in the verb) when the object is visible but not accessible; this method is meant to display an explanation of this condition.
  3918. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624><+!>cantReach(<+">actor, dolist, iolist, prep<-">)<-!>:  Called in a verb when the list of objects (only one of 
  3919. <+">dolist<-"></`>or <+">iolist<-"> will be non-nil) is visible but not accessible; this method is meant to display an explanation.<-"><-">
  3920. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624><+!><-">construct<-!>:  Called immediately after an object is created with the 
  3921. <:f200,QCourier New,>new<:f> operator.  Minimally, his method should install the object into its container's 
  3922. <:f200,QCourier New,>contents<:f> list.
  3923. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>contents<-!>:  The list of an object's contents.
  3924. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624><+!>destruct<-!>:  Called immediately before an object is destroyed with the 
  3925. <:f200,QCourier New,>delete<:f> operator.  Minimally, this method should remove the object from its container's 
  3926. <:f200,QCourier New,>contents<:f> list, and should make sure that the object is not referenced from any other lists or properties.
  3927. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624><+!>doAction<-!>:  Direct Object Action; associated with a <:f200,QCourier New,>deepverb<:f> object  Defines the verb template for a single-object command for a verb, and specifies the suffix for to be used for the action and verification methods for the ve
  3928. rb (<:f200,QCourier New,>do<+"><:f>Suffix<-"> and <:f200,QCourier New,>verDo<+"><:f>Suffix<-">, respectively).
  3929. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624><+!>dobjGen(<+">actor, verb, iobj, prep<-">)<-!>:  General direct object handler, called during command execution on the direct object prior to processing the verb's verification and action routines.
  3930. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624><+!>doDefault(<+">actor, prep, iobj<-">)<-!>:  Direct Object Default.  Associated with a 
  3931. <:f200,QCourier New,>deepverb<:f> object.  Returns the list of default objects for the verb.
  3932. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624><+!>ioAction(<+">prep<-">)<-!>:  Indirect Object Action; associated with a 
  3933. <:f200,QCourier New,>deepverb<:f> object. Defines the verb template for a two-object command for a verb with the given preposition, and specifies the suffix for to be used for the action and verification methods for the verb (<:f200,QCourier New,>io<+"><:f>
  3934. Suffix<-"> and <:f200,QCourier New,>verIo<+"><:f>Suffix<-">, respectively).
  3935. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624><+!>iobjGen(<+">actor, verb, dobj, prep<-">)<-!>:  General indirect object handler, called during command execution on the indirect object prior to processing the verb's verification and action routines.
  3936. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624><+!>ioDefault(<+">actor, prep<-">)<-!>:  Indirect Object Default; associated with a 
  3937. <:f200,QCourier New,>deepverb<:f> object.  Returns the list of default objects for the verb.
  3938. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624><+!>isEquivalent<-!>:  Used to determine if an object should be treated as equivalent to other objects of its immediate superclass.  If this property is 
  3939. <:f200,QCourier New,>true<:f>, the parser treats all objects of the same immediate superclass as this object as interchangeable during disambiguation.
  3940. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>isHim<-!>:  If <:f200,QCourier New,>true<:f>, the object can be the antecedant for the pronoun "him."
  3941. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>isHer<-!>:  If <:f200,QCourier New,>true<:f>, the object can be the antecedant for the pronoun "him."
  3942. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624><+!>isVisible(<+">vantage<-">)<-!>:  Used to determine if an object is visible from the given object.  The parser uses this to determine how to complain when an object isn't accessible:  if it's visible, but not accessible, the parser will use 
  3943. <:f200,QCourier New,>cantReach<:f> to complain, otherwise it will simply say "I can't see that here."
  3944. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>location<-!>:  The object which contains the object.
  3945. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624><+!>locationOK<-!>:  If this property is <:f200,QCourier New,>true<:f>, it tells the compiler that you know that the 
  3946. <:f200,QCourier New,>location<:f> property is not an object constant, and the compiler therefore suppresses the warning it would otherwise generate.
  3947. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624><+!>multisdesc<-!>:  Used by the parser to display the current object when iterating through a list of direct objects in a command.
  3948. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624><+!>nilPrep<-!>:  Associated with a <:f200,QCourier New,>deepverb<:f> object; used by the parser to determine the preposition to use when a command of the form VERB IOBJ DOBJ is entered.  If undefined, the preposition object associated with the word "to" is
  3949.  used by default.
  3950. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>noun<-!>:  Defines words as nouns, and associates them with the object.
  3951. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>plural<-!>:  Defines words as plurals, and associates them with the object.
  3952. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624><+!>preferredActor<-!>:  Used by the parser to determine if an object is a "preferred" actor; if this property is 
  3953. <:f200,QCourier New,>true<:f>, the object is chosen as the actor in cases where the actor is ambiguous and none of the other objects are preferred actors.
  3954. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624><+!>prepDefault<-!>:  Associated with a <:f200,QCourier New,>deepverb<:f> object.  The parser uses this property to find the default preposition object to use when the player enters a partial command that starts with the verb and a direct object, but omits 
  3955. the preposition and indirect object.
  3956. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>preposition<-!>:  Defines words as prepositions, and associates them with the object.
  3957. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624><+!>rejectMultiDobj(<+">prep<-">)<-!>:  Associated with a <:f200,QCourier New,>deepverb<:f> object.  If this method returns 
  3958. <:f200,QCourier New,>true<:f>, the verb doesn't allow multiple direct objects or "all."
  3959. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624><+!>roomAction(<+">actor, verb, dobj, prep, iobj<-">)<-!>:  Called in the actor's location during command execution.
  3960. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624><+!>roomCheck(<+">verb<-">)<-!>:  Called in the actor at the beginning of execution, before object disambiguation.
  3961. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>sdesc<-!>:  Short description.  Used by the parser to display an object's name.
  3962. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>statusLine<-!>:  Called in the actor's location to update the statue line.
  3963. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>thedesc<-!>:  Displays the object's name with a definite article.
  3964. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624><+!>validActor<-!>:  Called by the parser to determine if the object is valid as an actor.  This method doesn't check to see if the object is 
  3965. <+">logical<-"> to use as an actor, but simply if the object is <+">accessible<-"></`>as the target of a command.
  3966. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624><+!>validDo(<+">actor, obj, seqno<-">)<-!>:  Associated with a <:f200,QCourier New,>deepverb<:f> object.  Returns 
  3967. <:f200,QCourier New,>true<-"><:f> if the object is accessible as a direct object for the verb.
  3968. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624><+!>validDoList(<+">actor, prep, iobj<-">)<-!>:  Associated with a 
  3969. <:f200,QCourier New,>deepverb<:f> object.  Returns a list of possibly-valid direct objects for the verb.  The objects returned will be tested for validity with 
  3970. <:f200,QCourier New,>validDo<:f>, so the list can contain invalid objects as well, but it must contain 
  3971. <+">all<-"></`>of the valid direct objects for the verb.
  3972. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624><+!>validIo(<+">actor, obj, seqno<-">)<-!>:  Associated with a <:f200,QCourier New,>deepverb<:f> object.  Returns 
  3973. <:f200,QCourier New,>true<-"><:f> if the object is accessible as an indirect object for the verb.
  3974. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624><+!>validIoList(<+">actor, prep, dobj<-">)<-!>:  Associated with a 
  3975. <:f200,QCourier New,>deepverb<:f> object.  Returns a list of possibly-valid indirect objects for the verb.  The objects returned will be tested for validity with 
  3976. <:f200,QCourier New,>validI<:f><:f200,QCourier New,>o<:f>, so the list can contain invalid objects as well, but it must contain 
  3977. <+">all<-"></`>of the valid indirect objects for the verb.
  3978. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624><+!>value<-!>:  The parser sets this property of the <:f200,QCourier New,>strObj<:f> or 
  3979. <:f200,QCourier New,>numObj<:f> object to the actual value of the string or number (respectively) entered in a command.
  3980. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624><+!>verb<-!>:  Defines words as verbs, and associates them with the object.  Strings in this list can consist of one or two words; the second word must also be separately defined as a preposition.
  3981. <:I0,72,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3982. <:I0,0,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f240,2MinioMMSC_367 RG 585 NO 11 OP,><+!>Objects<-!><:f>
  3983. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624><+!>againVerb<-!>:  The <:f200,QCourier New,>deepverb<:f> object with the vocabulary for "again."  The parser internally handles the "again" processing when this verb's vocabulary word is entered as the command.
  3984. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624><+!>Me<-!>:  The player actor object.  When a command is not explicitly directed to another actor, this object is the actor to which the command is sent.
  3985. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624><+!>numObj<-!>:  A special object which is used as the direct object when a number is entered in a command (such as in "enter 30 on calculator," in which 
  3986. <:f200,QCourier New,>numObj<:f> is the direct object).  The <:f200,QCourier New,>value<:f> property is set to the number actually entered in the command.
  3987. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624><+!>strObj<-!>:  A special object which is used as the direct object when a quoted string is entered in a command (such as in 'type "hello" on keyboard,' in which 
  3988. <:f200,QCourier New,>strObj<:f> is the direct object).  The <:f200,QCourier New,>value<:f> property is set to the string actually entered in the command.
  3989. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><+!>takeVerb<-!>:  Formerly required, but no longer directly used by the parser.
  3990. <:I0,72,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  3991. <:I0,0,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624><:f240,2MinioMMSC_367 RG 585 NO 11 OP,><+!>Functions<-!><:f>
  3992. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624><+!>commandPrompt(<+">type<-">)<-!>:  The parser calls this function, if defined, to display the prompt before asking for a command.  The 
  3993. <+">type<-"></`>code specifies the type of input being requested.
  3994. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624><+!>init<-!>:  The system calls this immediately after loading the game, and again whenever the game is restarted.  This function can perform any startup operations, such as setting fuses and daemons, and displaying an introductory message.
  3995. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#546,6624><+!>pardon<-!>:  The parser calls this function whenever the player enters an empty command.  You can display an error message, if you wish.
  3996. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624><+!>parseAskobj(<+">verb, ...<-">)<-!>:  The parser calls this function, if defined, to prompt for a missing direct or indirect object.  If 
  3997. <:f200,QCourier New,>parseAskobjActor<:f> is defined, <:f200,QCourier New,>parseAskobj<:f> is ignored.  If two arguments are provided, an indirect object is being requested, and the second argument is a preposition (which may be 
  3998. <:f200,QCourier New,>nil<:f>); otherwise, a direct object is being requested.
  3999. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624><+!>parseAskobjActor<-!><+!>(<+">actor, verb, ...<-">)<-!>:  The parser calls this function, if defined, to prompt for a missing direct or indirect object.<-">  If three arguments are provided, an indirect object is being requested, and the third argument i
  4000. s a preposition (which may be <:f200,QCourier New,>nil<:f>); otherwise, a direct object is being requested.
  4001. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624><+!>parseDefault<-!><+!>(<+">obj, prep<-">)<-!>:  The parser calls this function, if defined, to display a message indicating that the object (and the preposition, if not 
  4002. <:f200,QCourier New,>nil<:f>) are being used by default.
  4003. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1365,6624><+!>parseDisambig<-!><+!>(<+">nameString, objList<-">)<-!>:  The parser calls this function, if defined, to prompt for more information when the player enters an ambiguous object name.  The 
  4004. <+">nameString<-"> is the string of words entered by the player (given as a single-quoted string), and the 
  4005. <+">objList<-"> is a list of the objects matching the name.
  4006. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624><+!>parseError<-!><+!>(<+">num, str<-">)<-!>:  The parser calls this function, if defined, to get the text of an error message.  
  4007. <+">num<-"> is the message number, and <+">str<-"> is the text of the message that the parser would display by default if this function weren't defined.<-">
  4008. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#1092,6624><+!>parseError2(<+">verb, dobj, prep, iobj<-">)<-!>:  The parser calls this function, if defined, to display a message indicating that the verb can't be applied to these objects (because one of the objects doesn't define or inherit a verification method for
  4009.  the verb).<-">
  4010. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#3549,6624><+!>preinit<-!>:  Called by the <+">compiler<-">, after compilation is complete, to perform any desired initialization.  This function can't set any fuses or daemons, or display any messages; these functions are not saved in the compiled game file, so they 
  4011. must wait until the <:f200,QCourier New,>init<:f> function, which is invoked at run-time.  The 
  4012. <:f200,QCourier New,>preinit<:f> function is intended to perform any time-consuming computation--for example, setting up lists of objects or initializing property values--that would otherwise be done in 
  4013. <:f200,QCourier New,>init<:f> every time the game is started.  By performing these functions in 
  4014. <:f200,QCourier New,>preinit<:f>, the work can be done at compile-time, saving players from having to wait for it each time they run the game.  Note that this function won't be called until run-time if the game is compiled for debugging; while this doesn't 
  4015. affect the behavior of the game (apart from slowing down run-time startup), it allows you to use the debugger to step through your 
  4016. <:f200,QCourier New,>preinit<:f> function.
  4017. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624><+!>preparse(<+">cmd<-">)<-!>:  The parser calls this function with a (single-quoted) string giving the full text of the command line each time the player enters a new command.
  4018. <:I0,162,432,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#819,6624><+!>preparseCmd<-!><+!>(<+">wordList<-">)<-!>:  The parser calls this function with a list of (single-quoted) strings giving the words of the current command.  This function is called for each individual command on a command line.
  4019. <:I0,432,0,0><:R1,15,1,720,1,1080,1,1440,1,1810,1,2160,1,2530,1,2880,1,3600,1,4320,1,5040,1,5760,1,6480,1,7200,1,7920,1,8640,><:#273,6624>
  4020. [Embedded]
  4021. 00618773
  4022.